Hive動態(tài)分區(qū)詳解
Hive系列文章
- Hive表的基本操作
- Hive中的集合數(shù)據(jù)類型
- Hive動態(tài)分區(qū)詳解
- hive中orc格式表的數(shù)據(jù)導(dǎo)入
- Java通過jdbc連接hive
- 通過HiveServer2訪問Hive
- SpringBoot連接Hive實(shí)現(xiàn)自助取數(shù)
- hive關(guān)聯(lián)hbase表
- Hive udf 使用方法
- Hive基于UDF進(jìn)行文本分詞
- Hive窗口函數(shù)row number的用法
- 數(shù)據(jù)倉庫之拉鏈表
動態(tài)分區(qū)調(diào)整
- 動態(tài)分區(qū)屬性:設(shè)置為true表示開啟動態(tài)分區(qū)功能(默認(rèn)為false)hive.exec.dynamic.partition=true;
- 動態(tài)分區(qū)屬性:設(shè)置為nonstrict,表示允許所有分區(qū)都是動態(tài)的(默認(rèn)為strict)設(shè)置為strict,表示必須保證至少有一個(gè)分區(qū)是靜態(tài)的hive.exec.dynamic.partition.mode=strict;
- 動態(tài)分區(qū)屬性:每個(gè)mapper或reducer可以創(chuàng)建的最大動態(tài)分區(qū)個(gè)數(shù)hive.exec.max.dynamic.partitions.pernode=100;
- 動態(tài)分區(qū)屬性:一個(gè)動態(tài)分區(qū)創(chuàng)建語句可以創(chuàng)建的最大動態(tài)分區(qū)個(gè)數(shù)hive.exec.max.dynamic.partitions=1000;
- 動態(tài)分區(qū)屬性:全局可以創(chuàng)建的最大文件個(gè)數(shù)hive.exec.max.created.files=100000;
- 控制DataNode一次可以打開的文件個(gè)數(shù) 這個(gè)參數(shù)必須設(shè)置在DataNode的$HADOOP_HOME/conf/hdfs-site.xml文件中
注意
在Hive中,動態(tài)分區(qū)會造成在插入數(shù)據(jù)過程中,生成過多零碎的小文件
動態(tài)分區(qū)插入
如果需要創(chuàng)建非常多的分區(qū),用戶就需要寫非常多的條件查詢sql把數(shù)據(jù)插入對應(yīng)分區(qū)。好在Hive
提供了動態(tài)分區(qū)功能,可以根據(jù)分區(qū)字段的取值自動創(chuàng)建分區(qū)。前面列出的開啟動態(tài)分區(qū)hive.exec.dynamic.partition
,并且hive.exec.dynamic.partition.mode
需要為非嚴(yán)格模式,通常如果分區(qū)很多的話,hive.exec.max.dynamic.partitions.pernode
也需要設(shè)置為一個(gè)較大的數(shù),否則會有報(bào)錯提醒。
現(xiàn)在有sql
:
可以看出,Hive
根據(jù)select
語句中最后兩列來確定分區(qū)字段country
和state
的值,這里刻意使用了不同的命名,就是為了強(qiáng)調(diào)源表字段和輸出分區(qū)值之間的關(guān)系是根據(jù)位置而不是根據(jù)命名來匹配的。
動靜分區(qū)結(jié)合
也可以混合使用動態(tài)和靜態(tài)分區(qū)。上面那個(gè)例子,我們可以指定國家這個(gè)分區(qū)值五為靜態(tài)值US
,而分區(qū)字段state
是動態(tài)值:
注意:靜態(tài)分區(qū)需要出現(xiàn)在動態(tài)分區(qū)字段之前。
動態(tài)分區(qū)功能默認(rèn)情況下是沒有開啟的,默認(rèn)是以嚴(yán)格
模式執(zhí)行,這種模式下要求至少有一列分區(qū)字段是靜態(tài)的。這樣做的好處是可以防止因設(shè)計(jì)或其它錯誤查詢導(dǎo)致產(chǎn)生大量的分區(qū),比如sql boy
不小心使用了時(shí)間戳作為分區(qū)字段,那將是災(zāi)難。在日常導(dǎo)入一天的數(shù)據(jù),通常是指定日期為靜態(tài)分區(qū),小時(shí)為動態(tài)分區(qū),進(jìn)行混合模式導(dǎo)入。
例子
建表
導(dǎo)入數(shù)據(jù)到test.test
表
利用動態(tài)分區(qū)插入
這里,(dt|hour)?+.+
表示查詢出test
表除了dt
和hour
這兩個(gè)字段的其它所有字段。
作者:柯廣的網(wǎng)絡(luò)日志
微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫