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;

 

posted @ 2020-03-17 19:24  Syui啦  阅读(8179)  评论(1编辑  收藏  举报