hive一级分区、二级分区、动态分区
一级分区
1、hive分区是根据某列的值进行划分,每个分区对应HDFS上的一个目录,以下就是分区表test.table_t在HDFS的存储路径,可以看到有202002和202003两个分区,且分区字段为month。
2、创建分区表
1 create table table_name( 2 no int,name string 3 ) 4 partitioned by (month string) 5 row format delimited fields terminated by "\t";
3、增加分区
1 alter table table_name add partition(month="202004") partition(month="202005");
4、删除分区
1 alter table table_name drop partition(month="202006") partition(month="202007");
5、查看分区表
1 -- 查看表分区 2 show partition table_name; 3 4 -- 查看分区表结构 5 desc format table_name;
6、数据加载
1 load data local inpath "/opt/module/datas/data.txt" into table table_name partition(month="202003"); 2 insert into table table_name partition (month="202003") values(...);
二级分区
1、建表语句
1 create table table_name( 2 no int,name string 3 ) 4 partitioned by (month string,day string) 5 row format delimited fields terminated by "\t";
2、数据加载
1 -- 从外部存储系统正常加载数据 2 load data local inpath "/opt/module/datas/data.txt" into table table_name partition(month="202003",day="02"); 3 4 -- 上传到HDFS后恢复 5 hive (default) > dfs -mkdir -p /user/hive/warehouse/table_name/month=202003/day=02; 6 hive (default) > dfs -put /opt/module/datas/data.txt /user/hive/warehouse/table_name/month=202003/day=02; 7 hive (default) > msck repair table table_name; 8 9 -- 上传数据到HDFS后添加分区 10 hive (default) > dfs -mkdir -p /user/hive/warehouse/table_name/month=202003/day=02; 11 hive (default) > dfs -put /opt/module/datas/data.txt /user/hive/warehouse/table_name/month=202003/day=02; 12 hive (default) > alter table table_name add partition(month="202003",day="03"); 13 14 -- 上传数据到HDFS后load数据到分区 15 hive (default) > dfs -mkdir -p /user/hive/warehouse/table_name/month=202003/day=02; 16 hive (defalut) > load data local inpath "/opt/module/datas/data.txt" in to table table_name partition(month="202003",day="03");
动态分区
1、动态分区所需属性
set hive.exec.dynamic.partition=true; --开启动态分区,必须参数
set hive.exec.dynamic.partition.mode=nonstrict(默认static); --允许所有分区都是动态的,否则必须有静态分区字段,必须参数
set hive.exec.max.dynamic.partitions.pernode=100; --(默认100,一般可以设置大一点,表示每个mapper或reducer可以创建的最大动态分区数)
set hive.exec.max.dynamic.partitions=1000;--(默认值,表示每一个动态分区语句创建的最大动态分区数)
2、创建一个单分区表
1 create table table_name(id int,name string) partition by (city string);
3、数据加载
1 -- 装载数据并动态以city建立分区 2 --因为table_name只有两个字段,所以查询三个字段时,系统默认将最后一个字段city作为分区名,分区字段也默认也是表中的字段,且依次排在表字段最后面,不是按照字段名称推断分区字段。 3 insert overwrite table table_name partition(city) select id,name,city from src_table; 4 5 -- 多个分区字段(部分静态分区部分动态分区) 6 create table target_table(id int) partitioned by (state string,city string); 7 --partition(state="china",city),表示state为静态分区,city为动态分区,以src_table中的city字段为分区名 8 insert overwrite table target_table partition(state="china",city) select id,city from src_table; 9 --state和city均使用动态分区 10 insert overwrite table target_table partition(state,city) select id,state,city from src_table;