靜態分區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分區插到了新編譯