静态分区SP(static partition)
动态分区DP(dynamic partition)
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是经过数据来进行判断。详细来讲,静态分区的列实在编译时期,经过用户传递来决定的;动态分区只有在SQL执行时才能决定。spa
一、建立一张分区表,包含两个分区dt和ht表示日期和小时code
CREATE TABLE partition_table001 ( name STRING, ip STRING ) PARTITIONED BY (dt STRING, ht STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
二、启用hive动态分区,只须要在hive会话中设置两个参数:ip
set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;
三、把partition_table001表某个日期分区下的数据load到目标表partition_table002 使用静态分区时,必须指定分区的值,如:it
create table if not exists partition_table002 like partition_table001; insert overwrite table partition_table002 partition (dt='20150617', ht='00') select name, ip from partition_table001 where dt='20150617' and ht='00';
此时咱们发现一个问题,若是但愿插入天天24小时的数据,则须要执行24次上面的语句。而动态分区会根据select出的结果自动判断数据改load到哪一个分区中去。
四、使用动态分区io
insert overwrite table partition_table002 partition (dt, ht) select * from partition_table001 where dt='20150617';
hive先获取select的最后两个位置的dt和ht参数值,而后将这两个值填写到insert语句partition中的两个dt和ht变量中,即动态分区是经过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是经过位置来肯定的,和名字并无关系,好比这里dt和st的名称彻底没有关系。
只须要一句SQL便可把20150617下的24个ht分区插到了新编译