往hive分区表中插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,比如etl_dt 、dat_dt日期 (格式为yyyyMMdd 或者yyyy-MM-dd这样)。每天落盘的数据会对应hdfs的一个目录。hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称。
1.创建一个单一字段分区表
hive>
create table dpartition(id int ,name string )
partitioned by(ct string );
2.往表里装载数据,并且动态建立分区,以city建立动态分区
hive>
hive.exec.dynamici.partition=true; #开启动态分区,默认是false
set hive.exec.dynamic.partition.mode=nonstrict; #开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
insert overwrite table dpartition
partition(ct)
select id ,name,city from mytest_tmp2_p;
要点:因为dpartition表中只有两个字段,和一个分区字段。所以当我们查询了三个字段时(多了city字段),所以系统默认以最后一个字段city为分区名,因为分区表的分区字段默认也是该表中的字段,且依次排在表中字段的最后面。所以分区需要分区的字段只能放在后面,不能把顺序弄错。如果我们查询了四个字段的话,则会报
错,因为该表加上分区字段也才三个。要注意系统是根据查询字段的位置推断分区名的,而不是字段名称。动态分区的字段只能也必须在最后面
hive>