Hive動態分割槽

突突修發表於2018-03-13

Hive動態分割槽

一)hive中支援兩種型別的分割槽:

靜態分割槽SP(static partition)
動態分割槽DP(dynamic partition)
靜態分割槽與動態分割槽的主要區別在於靜態分割槽是手動指定,而動態分割槽是通過資料來進行判斷。詳細來說,靜態分割槽的列實在編譯時期,通過使用者傳遞來決定的;動態分割槽只有在SQL執行時才能決定。

二)實戰演示如何在hive中使用動態分割槽

1、建立一張分割槽表,包含兩個分割槽dt和ht表示日期和小時

CREATE TABLE partition_table001 
(
    name STRING,
    ip STRING
)
PARTITIONED BY (dt STRING, ht STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "	";

2、啟用hive動態分割槽,只需要在hive會話中設定兩個引數:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

3、把partition_table001表某個日期分割槽下的資料load到目標表partition_table002 使用靜態分割槽時,必須指定分割槽的值,如:

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到哪個分割槽中去。
4、使用動態分割槽

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分割槽插到了新表中。


相關文章