Hive 分区表 (Partitioned Tables) 『 创建分区表 | CRUD分区 | 修复分区 | 数据导入(静态分区、动态分区) | 查询数据/表结构』

这篇具有很好参考价值的文章主要介绍了Hive 分区表 (Partitioned Tables) 『 创建分区表 | CRUD分区 | 修复分区 | 数据导入(静态分区、动态分区) | 查询数据/表结构』。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 为什么使用分区表?

  • 条件:假如现有一个角色表t_all_hero,该表中有6个清洗干净的互不干扰的数据文件:射手、坦克、战士、法师、刺客、辅助
    hive创建分区表,# Hive,hive,大数据,mysql
  • 要求:查找出名字为射手且生命值大于6000的角色人数
  • 惯性解决方法:按照MySQL思维很容易想到
    hive创建分区表,# Hive,hive,大数据,mysql
  1. 问:如何提高效率?这样虽然能够解决问题,但是由于要进行全表扫描,效率非常低。
  2. 答:由于6个文件已经清洗好了,且互不干扰,所以我们只需要从archer.txt中进行扫描就可以了。

总结:为了避免查询时进行全表扫描,Hive可以根据指定的字段对表进行分区扫描,提高查询效率。

2. 分区表DDL

2.1 创建分区表

在创建分区表时选择partitioned by关键字。比如:

create table person(
	id int,
	name string comment '名字',
	sex string comment '性别',
	city string comment '城市'
) 
-- 分区字段可以是1个,也可以是多个
partitioned by (sex_part string, city_part string)

注意:

  1. 分区字段不能是表中已经存在的字段,开发中一般是对某字段取别名做为分区字段。
  2. 分区字段最终也会以虚拟字段的形式显示在表结构上。如果以select * from person;,则查询结果在表字段name sexcity的基础上多显示分区字段sex_part city_part
  3. 分区字段本质上是将打上相同分区标签的数据放在同一个文件夹下,利用文件夹来区分不同数据。
    hive创建分区表,# Hive,hive,大数据,mysql
  4. 分区字段可以是1个,也可以是多个。

2.2 增加分区

  • add partition增加分区,并不会自动加载数据。如果分区位置中不存在数据,查询时将不会返回结果。因此需要保证增加的分区位置路径下,数据已经存在,或者增加完分区之后导入分区数据

    -- 1. 一次增加多个分区(这样算是静态设置分区)
    ALTER TABLE table_name ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808'
    PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';
    
    -- 2. 再使用load data 或 hadoop dfs -put 命令静态导入数据
    

2.3 删除分区

  • 一次删除多个分区
    ALTER TABLE table_name DROP [IF EXISTS] PARTITION (dt='2008-08-08', country='us');
    
    --直接删除数据 不进垃圾桶
    ALTER TABLE table_name DROP [IF EXISTS] PARTITION (dt='2008-08-08', country='us') PURGE; 
    

2.4 重命名分区

  • 一次重命名多个分区
    ALTER TABLE table_name PARTITION (dt='2008-08-09', country='us') RENAME TO PARTITION (dt='20080809', country='北京');
    

2.5 修复分区

  • hdfs上的分区与hive元数据中分区字段不一致的情况下,可以使用msck进行修复。
    MSCK REPAIR TABLE table_name [ADD/DROP/SYNC PARTITIONS];
    
    -- 比如:直接使用HDFS命令在表文件夹下创建分区文件夹dt='20080810'并上传数据,此时在Hive中
    --      查询是无法显示表数据,因为metastore中没有记录,使用MSCK ADD PARTITIONS进行修复。
    msck repair table table_name add partitions;
    
    -- 比如:直接使用HDFS命令删除了表文件夹下的分区文件夹dt='20080810',此时在Hive中查询显示
    --      分区还在,因为metastore中还没有被删除,使用MSCK DROP PARTITIONS进行修复。
    msck repair table table_name drop partitions;
    
    hive创建分区表,# Hive,hive,大数据,mysql

2.6 修改分区

  1. 更改分区文件存储格式

    ALTER TABLE table_name PARTITION (dt='2008-08-09') SET FILEFORMAT file_format;
    
  2. 更改分区位置

    ALTER TABLE table_name PARTITION (dt='2008-08-09') SET LOCATION "new location";
    

3. 分区表的数据导入

一旦创建了分区表,那么在向该分区表中导入数据时,就必须指定分区字段的值,即指定每条数据属于哪一个分区。而:

  1. 如果需要手动指定分区字段的值,叫做静态分区
  2. 如果自动指定分区字段的值,叫动态分区

(1) 静态分区

  1. 语法:使用load data + into table关键字:

    load data [local] inpath 'filepath ' 
    into table tablename partition(分区字段1='分区值1', 分区字段2='分区值2'...);
    

    直接将文件数据导入到分区表。其实就是将文件导入对应的文件夹下

  2. 例子:

    load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou');
    load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
    load data local inpath '/root/hivedata/mage.txt' into table t_all_hero_part partition(role='fashi');
    load data local inpath '/root/hivedata/support.txt' into table t_all_hero_part partition(role='fuzhu');
    load data local inpath '/root/hivedata/tank.txt' into table t_all_hero_part partition(role='tanke');
    load data local inpath '/root/hivedata/warrior.txt' into table t_all_hero_part partition(role='zhanshi');
    

    然后,在hdfs中查看可知,文件结构由表名文件夹/文件名变为表名文件夹/分区字段=分区值/文件名:中间多了一层文件夹。
    hive创建分区表,# Hive,hive,大数据,mysql

    对比创建普通表,不是分区表时,hdfs中文件结构为:
    hive创建分区表,# Hive,hive,大数据,mysql

(2) 动态分区

在静态分区中,可以发现有几个分区值,就要使用load语法分几次导入数据,非常麻烦。

动态分区解决了这个问题,只需要一次加载全部数据,就可以为全部数据打上标签。

  1. 首先要预先设置动态分区:

    -- 是否开启动态分区功能。如果该表在创建时有partition关键字,则这里不需要再写该语句
    set hive.exec.dynamic.partition=true;
    
    -- 指定动态分区模式,分为nonstick非严格模式和strict严格模式。
    -- strict严格模式要求至少有一个分区为静态分区。
    set hive.exec.dynamic.partition.mode=nonstrict;
    
  2. 语法:使用insert + select 语法导入数据

    insert into table 分区表名称 partition(分区字段1名称, 分区字段2名称) 
    select 
    	...,
    	分区字段1按照table_name的哪个字段值分区,
    	分区字段2按照table_name的哪个字段值分区
    from table_name;
    

    将表的查询结果导入到分区表

  3. 例子:

    --创建一张新的分区表 t_all_hero_part_dynamic
    create table t_all_hero_part_dynamic(
    	id int,
    	name string,
    	hp_max int,
    	mp_max int,
    	attack_max int,
    	defense_max int,
    	attack_range string,
    	role_main string,
    	role_assist string
    ) partitioned by (role string)
    row format delimited fields terminated by "\t";
    
    --执行动态分区插入
    insert into table t_all_hero_part_dynamic partition(role) 
    select 
    	tmp.*,
    	tmp.role_main
    from t_all_hero tmp;
    

4. 查询

4.1 查询分区表数据

对于分区表的查询,尽量先使用where进行分区过滤,查询指定分区的数据,避免全表扫描。

比如:

-- role是分区字段
select count(*) from t_all_hero_part where role="sheshou" and hp_max >6000;

4.2 查询分区表结构

  1. 查看分区表有哪些分区字段

    desc formatted table_name;
    

    hive创建分区表,# Hive,hive,大数据,mysql

  2. 查看分区表分了几个区

    show partitions table_name;
    

    hive创建分区表,# Hive,hive,大数据,mysql

5. 小结

  • 分区表好处:查询时可以避免全表扫描,提高查询效率。

hive创建分区表,# Hive,hive,大数据,mysql文章来源地址https://www.toymoban.com/news/detail-766463.html

到了这里,关于Hive 分区表 (Partitioned Tables) 『 创建分区表 | CRUD分区 | 修复分区 | 数据导入(静态分区、动态分区) | 查询数据/表结构』的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive分区表实战 - 多分区字段

    本实战教程通过一系列Hive SQL操作,演示了如何在大数据环境下创建具有省市分区的大学表,并从本地文件系统加载不同地区的学校数据到对应分区。首先,创建名为 school 的数据库并切换至该数据库;接着,在数据库中定义一个名为 university 的分区表,其结构包括ID和名称两

    2024年01月15日
    浏览(48)
  • Hive分区表修改(增删)列

    环境:CDH6.3.0,Hive 2.1.1-cdh6.3.0 基础数据分区表test1,包含a,b,c,d共4列加分区列p_day,向其中插入两行数据 表中数据及parquet文件信息如下: test2表直接使用test1表的文件: 修复分区并查询数据 删除test2表的a列,看起来只有通过replace columns实现,但是运行报错,根据官方文档,只

    2023年04月26日
    浏览(88)
  • Hive 分区表和分桶表

    在《Hive 建表语句解析》文章中,建表的时候我们可以使用 PARTITIONED BY 子句和 CLUSTERED BY 子句来创建分区表和分桶表,为什么要创建分区表和分桶表呢?分区表和分桶表有什么区别呢? 1. 为什么分区 在Hive 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时

    2023年04月23日
    浏览(67)
  • Hive 分区表新增字段 cascade

    在以前上线的分区表中新加一个字段,并且要求添加到指定的位置列。 加 cascade 操作 创建测试表 插入测试数据 查看现有数据 官网添加列的语法 注意: Hive 1.1.0 中有 CASCADE|RESTRICT 子句。 ALTER TABLE ADD|REPLACE COLUMNS CASCADE 命令修改表元数据的列,并将相同的更改级联到所有分区

    2024年02月11日
    浏览(56)
  • Hive ---- 分区表和分桶表

    Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 1. 创建分区表 2. 分区表读写数据 1)写数据 (1)load 数据准备 在/opt/module/hiv

    2024年02月10日
    浏览(61)
  • 二次开发DataX以支持HIVE分区表

            最近在一个大数据的项目开发中使用到了数据同步工具DataX,但在使用过程中发现了DataX对HIve分区表的支持不太友好。         具体体现在将数据库中的数据同步到HIVE分区表时,写入目录为HIVE表分区为dt=XXXX,如果不提前创建该分区,会报目录不存在的错误,如

    2024年02月16日
    浏览(48)
  • 【Hive大数据】Hive分区表与分桶表使用详解

    目录 一、分区概念产生背景 二、分区表特点 三、分区表类型 3.1 单分区 3.2 多分区

    2024年02月03日
    浏览(48)
  • hive分区表之insert overwrite 注意事项

    hive version 3.1.3 以往我们插入分区 需要 insert ovewrite table  p_table partition(period_id=‘202212’)  select id name from xxxx;  或者是 insert overwrite table  select  id,name,period_id from table where period_id=202212 前者是指定分区,后者是动态分区。没啥好说的。 但是今天遇到一个问题,如果我查询的数

    2024年02月13日
    浏览(57)
  • HIVE表数据快速构造(分区表、orc、text)

    引言 当需要在hive数仓中去创建测试表并构造测试数据时,通常需要在安装了hive客户端的服务器环境下,通过执行命令的方式建表。通过在HDFS上上传和加载数据文件的方式来加载数据到hive表中。其中操作算不得多复杂,但比较依赖对环境和命令的熟悉,并且操作不够可视化

    2024年02月16日
    浏览(47)
  • 【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

    最近在使用海豚调度DolphinScheduler的Datax组件时,遇到这么一个问题:之前给客户使用海豚做的离线数仓的分层搭建,一直都运行好好的,过了个元旦,这几天突然在数仓做任务时报错,具体报错信息如下: com.alibaba.datax.common.exception.DataXException: Code:[HdfsReader-08], Description:[您尝

    2024年01月16日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包