您好,登錄后才能下訂單哦!
本篇文章為大家展示了Hive中怎么實(shí)現(xiàn)動(dòng)態(tài)分區(qū),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
動(dòng)態(tài)分區(qū)調(diào)整
動(dòng)態(tài)分區(qū)屬性:設(shè)置為true表示開啟動(dòng)態(tài)分區(qū)功能(默認(rèn)為false)hive.exec.dynamic.partition=true;
動(dòng)態(tài)分區(qū)屬性:設(shè)置為nonstrict,表示允許所有分區(qū)都是動(dòng)態(tài)的(默認(rèn)為strict)設(shè)置為strict,表示必須保證至少有一個(gè)分區(qū)是靜態(tài)的hive.exec.dynamic.partition.mode=strict;
動(dòng)態(tài)分區(qū)屬性:每個(gè)mapper或reducer可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)hive.exec.max.dynamic.partitions.pernode=100;
動(dòng)態(tài)分區(qū)屬性:一個(gè)動(dòng)態(tài)分區(qū)創(chuàng)建語(yǔ)句可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)hive.exec.max.dynamic.partitions=1000;
動(dòng)態(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文件中
<property> <name>dfs.datanode.max.xcievers</name> <value>8192</value> </property>
注意
在Hive中,動(dòng)態(tài)分區(qū)會(huì)造成在插入數(shù)據(jù)過(guò)程中,生成過(guò)多零碎的小文件
動(dòng)態(tài)分區(qū)插入
如果需要?jiǎng)?chuàng)建非常多的分區(qū),用戶就需要寫非常多的條件查詢sql把數(shù)據(jù)插入對(duì)應(yīng)分區(qū)。好在Hive提供了動(dòng)態(tài)分區(qū)功能,可以根據(jù)分區(qū)字段的取值自動(dòng)創(chuàng)建分區(qū)。前面列出的開啟動(dòng)態(tài)分區(qū)hive.exec.dynamic.partition,并且hive.exec.dynamic.partition.mode需要為非嚴(yán)格模式,通常如果分區(qū)很多的話,hive.exec.max.dynamic.partitions.pernode也需要設(shè)置為一個(gè)較大的數(shù),否則會(huì)有報(bào)錯(cuò)提醒。
現(xiàn)在有sql:
insert overwrite table employees partitions (country, state) select ...,se.cnty, se.st from staged_employees se;
可以看出,Hive根據(jù)select語(yǔ)句中最后兩列來(lái)確定分區(qū)字段country和state的值,這里刻意使用了不同的命名,就是為了強(qiáng)調(diào)源表字段和輸出分區(qū)值之間的關(guān)系是根據(jù)位置而不是根據(jù)命名來(lái)匹配的。
動(dòng)靜分區(qū)結(jié)合
也可以混合使用動(dòng)態(tài)和靜態(tài)分區(qū)。上面那個(gè)例子,我們可以指定國(guó)家這個(gè)分區(qū)值五為靜態(tài)值US,而分區(qū)字段state是動(dòng)態(tài)值:
insert overwrite table employees partitions (country = 'US', state) select ...,se.cnty, se.st from staged_employees se where se.cnty = 'US';
注意:靜態(tài)分區(qū)需要出現(xiàn)在動(dòng)態(tài)分區(qū)字段之前。
動(dòng)態(tài)分區(qū)功能默認(rèn)情況下是沒有開啟的,默認(rèn)是以嚴(yán)格模式執(zhí)行,這種模式下要求至少有一列分區(qū)字段是靜態(tài)的。這樣做的好處是可以防止因設(shè)計(jì)或其它錯(cuò)誤查詢導(dǎo)致產(chǎn)生大量的分區(qū),比如sql boy不小心使用了時(shí)間戳作為分區(qū)字段,那將是災(zāi)難。在日常導(dǎo)入一天的數(shù)據(jù),通常是指定日期為靜態(tài)分區(qū),小時(shí)為動(dòng)態(tài)分區(qū),進(jìn)行混合模式導(dǎo)入。
例子
建表
create table if not exists test.test ( id string, name string ) partitioned by (dt string,hour string) row format delimited fields terminated by '\t'; create table if not exists test.test2 ( id string, name string ) partitioned by (dt string,hour string) row format delimited fields terminated by '\t' stored as orc;
導(dǎo)入數(shù)據(jù)到test.test表
load data local inpath '/home/hadoop/data/test.txt' into table test.test partition(dt = '2019-09-10', hour = '02'); test.txt 001 keguang 002 kg 003 kk 004 ikeguang
利用動(dòng)態(tài)分區(qū)插入
insert overwrite table test.test2 partition(dt, hour) select `(dt|hour)?+.+`,dt,hour from test.test;
上述內(nèi)容就是Hive中怎么實(shí)現(xiàn)動(dòng)態(tài)分區(qū),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。