往hive分區表中插入數據時,如果一張表的數據量非常大,需要按照日期分區,且將指定日期的數據插入到對應分區,如果使用進來分區一天一天的手工輸入,效率極低,故hive提供了一個動態分區功能,其可以基於查詢參數的位置去推斷分區的名稱,從而建立分區。
假如有兩張表臨時表 trade_detail_his 和目標表 Historical 表
create table Historical (Id string) partitioned by (dt string) row format delimited fields terminated by ',';
然后往目標表Historical 插入數據
SET hive.exec.dynamic.partition=true; --開啟動態分區,默認是false SET hive.exec.dynamic.partition.mode=nonstric; -- 開啟允許所有分區都是動態的,否則必須要有靜態分區才能使用。 insert into Historical partition(dt) select id as id, product_code as dt from default.trade_detail_his; --寫成多行數據insert進去,目前也在找原因中
查看分區信息
show partitions Historical ;
注意:
要點1:分區字段放在最后,且要按照順序寫。因為Historical 表中只有一個字段,所以當我們查詢了兩個字段時(多了dt字段),所以系統默認以最后一個字段dt為分區名,因為分區表的分區字段默認也是該表中的字段,且依次排在表中字段的最后面。所以分區需要分區的字段只能放在后面,不能把順序弄錯。如果我們查詢了三個字段的話,則會報錯,因為該表加上分區字段也才兩個個。要注意系統是根據查詢字段的位置推斷分區名的,而不是字段名稱。
要點2:字段類型保持一致,不然進去的數據會用null填充