分割槽是hive存放資料的一種方式。將列值作為目錄來存放資料,就是乙個分割槽。這樣查詢時使用分割槽列進行過濾,只需根據列值直接掃瞄對應目錄下的資料,不掃瞄其他不關心的分割槽,快速定位,提高查詢效率。hive中支援兩種型別的分割槽:
靜態分割槽sp(static partition)
動態分割槽dp(dynamic partition)
靜態分割槽與動態分割槽的主要區別在於靜態分割槽是手動指定,而動態分割槽是通過資料來進行判斷。詳細來說,靜態分割槽的列是在編譯時期,通過使用者傳遞來決定的;動態分割槽只有在sql執行時才能決定。
關係型資料庫(如oracle)中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽(dynamic partition)。
按照常規的方法向分割槽表中插入資料,如果源資料量很大,那麼針對乙個分割槽就要寫乙個insert,非常麻煩,而且你必須先要知道源資料中都有什麼樣的資料才能建立分割槽。例如:
hive>
insert overwrite table partition_test partition
(stat_date=
'20110728'
,province=
'henan'
)select
member_id
,name
from
partition_test_input
where
stat_date=
'20110728'
and province=
'henan'
;
使用動態分割槽可以很好的解決上述問題。動態分割槽可以根據查詢得到的資料自動匹配到相應的分割槽中去。只不過,使用hive的動態分割槽,需要進行相應的配置。
●set hive.exec.dynamic.partition=true;–是否允許動態分割槽
預設值:false
是否開啟動態分割槽功能,預設false關閉。
使用動態分割槽時候,該引數必須設定成true。
●set hive.exec.dynamic.partition.mode=nonstrict; --分割槽模式設定
預設值:strict
動態分割槽的模式,預設strict,表示必須指定至少乙個分割槽為靜態分割槽。
nonstrict模式:表示允許所有的分割槽欄位都可以使用動態分割槽。
●set hive.exec.max.dynamic.partitions=1500;–允許動態分割槽的最大數量
預設值:1000
在所有執行mr的節點上,最大一共可以建立多少個動態分割槽。
同上引數解釋。
●hive.exec.max.created.files=100000;–乙個mapreduce作業能建立的hdfs檔案最大數
預設值:100000
整個mr job中,最大可以建立多少個hdfs檔案。
一般預設值足夠了,除非你的資料量非常大,需要建立的檔案數大於100000,可根據實際情況加以調整。
此處補充知識點:使用動態分割槽可能遇到分割槽檔案數超10萬的情況,解決辦法參考distribute by控制分割槽檔案數
●hive.error.on.empty.partition=false;–在動態分割槽插入產生空結果時是否丟擲異常
預設值:false
當有空分割槽生成時,是否丟擲異常。一般不需要設定。
##建立分割槽表
create
table
ifnot
exists partition_test
( member_id string
,name string
)partitioned by
(stat_date string,province string)
;
##設定動態分割槽引數
set hive.
exec
.dynamic.
partition
=true
;set hive.
exec
.dynamic.
partition
.mode
=nonstrict;
set hive.
exec
.max.dynamic.partitions.pernode=
1000
;set hive.
exec
.max.dynamic.partitions=
1500
;
##插入資料
動態分割槽的使用方法很簡單,假設我想向stat_date='20110728』這個分割槽下面插入資料,至於province插入到哪個子分割槽下面讓資料庫自己來判斷。那可以這樣寫:
insert overwrite table partition_test partition
(stat_date=
'20110728'
,province)
select
member_id
,name
,province
from
partition_test_input
where
stat_date=
'20110728'
;
stat_date叫做靜態分割槽列,province叫做動態分割槽列。這樣stat_date='20110728』的所有資料,會根據province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子資料夾下,如果源資料對應的province子分割槽不存在,則會自動建立,非常方便,而且避免了人工控制插入資料與分割槽的對映關係存在的潛在風險。
注:select子句中需要把動態分割槽列按照分割槽的順序寫出來,靜態分割槽列不用寫出來。
1、盡量不要用動態分割槽,因為動態分割槽的時候,將會為每乙個分割槽分配reducer數量,當分割槽數量多的時候,reducer數量將會增加,對伺服器是一種災難。
2、動態分割槽和靜態分割槽的區別,靜態分割槽不管有沒有資料都將會建立該分割槽,動態分割槽是有結果集將建立,否則不建立。
3、hive動態分割槽的嚴格模式和hive提供的hive.mapred.mode的嚴格模式。
hive提供我們乙個嚴格模式:為了阻止使用者不小心提交惡意hql
hive.mapred.mode=nostrict : strict
如果該模式值為strict,將會阻止以下三種查詢:
(1)對分割槽表查詢,where中過濾字段不是分割槽字段。
(2)笛卡爾積join查詢,join查詢語句,不帶on條件或者where條件。
(3)對order by查詢,有order by的查詢不帶limit語句。
4、動態分割槽不允許主分割槽採用動態列而副分割槽採用靜態列,這樣將導致所有的主分割槽都要建立副分割槽靜態列所定義的分割槽。
5、動態分割槽可以允許所有的分割槽列都是動態分割槽列,但是要首先設定乙個引數:hive.exec.dynamic.partition.mode。
[參考資料1]:動態分割槽說明
[參考資料2]:大資料開發學習之hive的動態分割槽
MapReduce的分割槽 (Partition)
分割槽的概念 在mapreduce中,資料進行map轉換後,預設根據map後資料的key值進行雜湊派發,同乙個分割槽的資料傳送到同乙個reduce中去處理。但實際中,這種方式不是高效的,並且有時並不能滿足我們的需求。所以我們需要自定義分割槽方式,根據自己的需求,選擇記錄的reducer。進行自定義分...
spark按照key分割槽 partitionBy
按照key分割槽,所以資料必須是k v鍵值對型別 val rdd rdd string int sc.makerdd list a 1 b 2 c 3 d 4 2 println 重新分割槽前 index,datas collect println 重新分割槽後 按照雜湊值進行分割槽 val new...
hive 分割槽 hive 分割槽概念 0323
1 hive 分割槽表 在hive select查詢中一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃瞄表中關心的一部分資料,因此建表時引入了partition概念。分割槽表指的是在建立表時指定的partition的分割槽空間。hive可以對資料按照某列或者某些列進行分割槽管理,所...