hive 自動生成動態分割槽
阿新 • • 發佈:2019-02-11
一、設定引數
--允許使用動態分割槽可通過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