Hive的分区(partition)-动态分区
Hive的分區(qū)
聲明:本文為博主參考網(wǎng)上資料整理的文章,未經(jīng)博主允許不得轉(zhuǎn)載,如有問題,歡迎指正。
一、概述
分區(qū)是hive存放數(shù)據(jù)的一種方式。將列值作為目錄來存放數(shù)據(jù),就是一個分區(qū)。這樣查詢時使用分區(qū)列進行過濾,只需根據(jù)列值直接掃描對應目錄下的數(shù)據(jù),不掃描其他不關(guān)心的分區(qū),快速定位,提高查詢效率。hive中支持兩種類型的分區(qū):
靜態(tài)分區(qū)SP(static partition)
動態(tài)分區(qū)DP(dynamic partition)
靜態(tài)分區(qū)與動態(tài)分區(qū)的主要區(qū)別在于靜態(tài)分區(qū)是手動指定,而動態(tài)分區(qū)是通過數(shù)據(jù)來進行判斷。詳細來說,靜態(tài)分區(qū)的列是在編譯時期,通過用戶傳遞來決定的;動態(tài)分區(qū)只有在SQL執(zhí)行時才能決定。
二、動態(tài)分區(qū)說明
關(guān)系型數(shù)據(jù)庫(如Oracle)中,對分區(qū)表Insert數(shù)據(jù)時候,數(shù)據(jù)庫自動會根據(jù)分區(qū)字段的值,將數(shù)據(jù)插入到相應的分區(qū)中,Hive中也提供了類似的機制,即動態(tài)分區(qū)(Dynamic Partition)。
按照常規(guī)的方法向分區(qū)表中插入數(shù)據(jù),如果源數(shù)據(jù)量很大,那么針對一個分區(qū)就要寫一個insert,非常麻煩,而且你必須先要知道源數(shù)據(jù)中都有什么樣的數(shù)據(jù)才能創(chuàng)建分區(qū)。例如:
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';使用動態(tài)分區(qū)可以很好的解決上述問題。動態(tài)分區(qū)可以根據(jù)查詢得到的數(shù)據(jù)自動匹配到相應的分區(qū)中去。只不過,使用Hive的動態(tài)分區(qū),需要進行相應的配置。
三、動態(tài)分區(qū)的相關(guān)配置
●set hive.exec.dynamic.partition=true;–是否允許動態(tài)分區(qū)
? ?默認值:false
? ?是否開啟動態(tài)分區(qū)功能,默認false關(guān)閉。
? ?使用動態(tài)分區(qū)時候,該參數(shù)必須設置成true。
●set hive.exec.dynamic.partition.mode=nonstrict; --分區(qū)模式設置
? ?默認值:strict
? ?動態(tài)分區(qū)的模式,默認strict,表示必須指定至少一個分區(qū)為靜態(tài)分區(qū)。
? ?nonstrict模式:表示允許所有的分區(qū)字段都可以使用動態(tài)分區(qū)。
●set hive.exec.max.dynamic.partitions.pernode=1000;–單個節(jié)點上的mapper/reducer允許創(chuàng)建的最大分區(qū)
? ?默認值:100
? ?在每個執(zhí)行MR的節(jié)點上,最大可以創(chuàng)建多少個動態(tài)分區(qū)。該參數(shù)需要根據(jù)實際的數(shù)據(jù)來設定。
? ?比如:源數(shù)據(jù)中包含了一年的數(shù)據(jù),即day字段有365個值,那么該參數(shù)就需要設置成大于365,如果使用默認值100,則會報錯。
●set hive.exec.max.dynamic.partitions=1500;–允許動態(tài)分區(qū)的最大數(shù)量
? ?默認值:1000
? ?在所有執(zhí)行MR的節(jié)點上,最大一共可以創(chuàng)建多少個動態(tài)分區(qū)。
? ?同上參數(shù)解釋。
●hive.exec.max.created.files=100000;–一個mapreduce作業(yè)能創(chuàng)建的HDFS文件最大數(shù)
? ?默認值:100000
? ?整個MR Job中,最大可以創(chuàng)建多少個HDFS文件。
? ?一般默認值足夠了,除非你的數(shù)據(jù)量非常大,需要創(chuàng)建的文件數(shù)大于100000,可根據(jù)實際情況加以調(diào)整。
此處補充知識點:使用動態(tài)分區(qū)可能遇到分區(qū)文件數(shù)超10萬的情況,解決辦法參考distribute by控制分區(qū)文件數(shù)
●hive.error.on.empty.partition=false;–在動態(tài)分區(qū)插入產(chǎn)生空結(jié)果時是否拋出異常
? ?默認值:false
? ?當有空分區(qū)生成時,是否拋出異常。一般不需要設置。
四、動態(tài)分區(qū)的操作
創(chuàng)建分區(qū)表
create table if not exists partition_test (member_id string,name string )partitioned by(stat_date string,province string) ;設置動態(tài)分區(qū)參數(shù)
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;插入數(shù)據(jù)
動態(tài)分區(qū)的使用方法很簡單,假設我想向stat_date='20110728’這個分區(qū)下面插入數(shù)據(jù),至于province插入到哪個子分區(qū)下面讓數(shù)據(jù)庫自己來判斷。那可以這樣寫:
stat_date叫做靜態(tài)分區(qū)列,province叫做動態(tài)分區(qū)列。這樣stat_date='20110728’的所有數(shù)據(jù),會根據(jù)province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夾下,如果源數(shù)據(jù)對應的province子分區(qū)不存在,則會自動創(chuàng)建,非常方便,而且避免了人工控制插入數(shù)據(jù)與分區(qū)的映射關(guān)系存在的潛在風險。
注:select子句中需要把動態(tài)分區(qū)列按照分區(qū)的順序?qū)懗鰜?#xff0c;靜態(tài)分區(qū)列不用寫出來。
五、分區(qū)注意細節(jié)
1、盡量不要用動態(tài)分區(qū),因為動態(tài)分區(qū)的時候,將會為每一個分區(qū)分配reducer數(shù)量,當分區(qū)數(shù)量多的時候,reducer數(shù)量將會增加,對服務器是一種災難。
2、動態(tài)分區(qū)和靜態(tài)分區(qū)的區(qū)別,靜態(tài)分區(qū)不管有沒有數(shù)據(jù)都將會創(chuàng)建該分區(qū),動態(tài)分區(qū)是有結(jié)果集將創(chuàng)建,否則不創(chuàng)建。
3、hive動態(tài)分區(qū)的嚴格模式和hive提供的hive.mapred.mode的嚴格模式。
? ?hive提供我們一個嚴格模式:為了阻止用戶不小心提交惡意hql
? ?hive.mapred.mode=nostrict : strict
? ?如果該模式值為strict,將會阻止以下三種查詢:
? ?? ?(1)對分區(qū)表查詢,where中過濾字段不是分區(qū)字段。
? ?? ?(2)笛卡爾積join查詢,join查詢語句,不帶on條件或者where條件。
? ?? ?(3)對order by查詢,有order by的查詢不帶limit語句。
4、動態(tài)分區(qū)不允許主分區(qū)采用動態(tài)列而副分區(qū)采用靜態(tài)列,這樣將導致所有的主分區(qū)都要創(chuàng)建副分區(qū)靜態(tài)列所定義的分區(qū)。
5、動態(tài)分區(qū)可以允許所有的分區(qū)列都是動態(tài)分區(qū)列,但是要首先設置一個參數(shù):hive.exec.dynamic.partition.mode。
6、注意!!!
hive用了動態(tài)分區(qū),若select語句無數(shù)據(jù),則insert overwrite并不會覆蓋。因為動態(tài)分區(qū)由select決定,select語句無數(shù)據(jù),分區(qū)也無法確定,故無法實現(xiàn)動態(tài)覆蓋。此時想要修正表數(shù)據(jù),需要手動刪除該分區(qū)。
[參考資料1]:動態(tài)分區(qū)說明
[參考資料2]:大數(shù)據(jù)開發(fā)學習之Hive的動態(tài)分區(qū)
總結(jié)
以上是生活随笔為你收集整理的Hive的分区(partition)-动态分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端自动化测试(基于QT4W框架)
- 下一篇: 仿真测试 | HIL测试简单介绍