hive 自動生成動態分區

一、設置參數
--允許使用動態分區可通過set hive.exec.dynamic.partition;查看
set hive.exec.dynamic.partition=true;
--當需要設置所有列爲dynamic時需要這樣設置
set hive.exec.dynamic.partition.mode=nonstrict;
--如果分區總數超過這個數量會報錯
set hive.exec.max.dynamic.partitions=1000;
--單個MR Job允許創建分區的最大數量
set hive.exec.max.dynamic.partitions.pernode=1000;

二、sql語句

insert overwrite table temp_table_new partition(year,month,day)
select field1, field2, year, month, day
from temp_table;
動態分區的使用方法很簡單,假設我想向stat_date='20110728'這個分區下面插入數據,至於province插入到哪個子分區下面讓數據庫自己來判斷,那可以這樣寫:

hive> insert overwrite table partition_test partition(stat_date='20110728',province)
> select member_id,name,province from partition_test_input where stat_date='20110728';
Total MapReduce jobs = 2
...
3 Rows loaded to partition_test
OK

stat_date叫做靜態分區列,province叫做動態分區列。select子句中需要把動態分區列按照分區的順序寫出來,靜態分區列不用寫出來。這樣stat_date='20110728'的所有數據,會根據province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夾下,如果源數據對應的province子分區不存在,則會自動創建,非常方便,而且避免了人工控制插入數據與分區的映射關係存在的潛在風險。

注意,動態分區不允許主分區採用動態列而副分區採用靜態列,這樣將導致所有的主分區都要創建副分區靜態列所定義的分區:

hive> insert overwrite table partition_test partition(stat_date,province='liaoning')
> select member_id,name,province from partition_test_input where province='liaoning';
FAILED: Error in semantic analysis: Line 1:48 Dynamic partition cannot be the parent of a static partition 'liaoning'

動態分區可以允許所有的分區列都是動態分區列,但是要首先設置一個參數hive.exec.dynamic.partition.mode :

hive> set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict

它的默認值是strick,即不允許分區列全部是動態的,這是爲了防止用戶有可能原意是隻在子分區內進行動態建分區,但是由於疏忽忘記爲主分區列指定值了,這將導致一個dml語句在短時間內創建大量的新的分區(對應大量新的文件夾),對系統性能帶來影響。
所以我們要設置:
hive> set hive.exec.dynamic.partition.mode=nostrick;

再介紹3個參數:
hive.exec.max.dynamic.partitions.pernode (缺省值100):每一個mapreduce job允許創建的分區的最大數量,如果超過了這個數量就會報錯
hive.exec.max.dynamic.partitions (缺省值1000):一個dml語句允許創建的所有分區的最大數量
hive.exec.max.created.files (缺省值100000):所有的mapreduce job允許創建的文件的最大數量
注意:如果父分區是動態分區,那麼子分區不能是靜態分區
爲了讓分區列的值相同的數據儘量在同一個mapreduce中,這樣每一個mapreduce可以儘量少的產生新的文件夾,可以藉助distribute by的功能,將分區列值相同的數據放到一起:

hive> insert overwrite table partition_test partition(stat_date,province)
> select member_id,name,stat_date,province from partition_test_input distribute by stat_date,province;
Total MapReduce jobs = 1
...
18 Rows loaded to partition_test
OK






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章