hive中怎么實(shí)現(xiàn)動(dòng)態(tài)分區(qū)和靜態(tài)分區(qū),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
改則網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,改則網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為改則上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的改則做網(wǎng)站的公司定做!
hive中分區(qū)表分為:范圍分區(qū)、列表分區(qū)、hash分區(qū)、混合分區(qū)等。
分區(qū)列:分區(qū)列不是表中的一個(gè)實(shí)際的字段,而是一個(gè)或者多個(gè)偽列。翻譯一下是:“在表的數(shù)據(jù)文件中實(shí)際上并不保存分區(qū)列的信息與數(shù)據(jù)”,這個(gè)概念十分重要,要記住,后面是經(jīng)常用到。
下面的語句創(chuàng)建了一個(gè)簡單的分區(qū)表:
create table partition_test( member_id string, name string ) partitioned by ( stat_date string, province string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
這個(gè)例子中創(chuàng)建了stat_date和province兩個(gè)字段作為分區(qū)列。如果要添加數(shù)據(jù),通常情況下我們需要先創(chuàng)建好分區(qū),然后才能使用該分區(qū),例如:
alter table partition_test add partition (stat_date='20141113',province='jilin');
這樣就創(chuàng)建好了一個(gè)分區(qū)。這時(shí)我們會(huì)看到hive在HDFS存儲(chǔ)中創(chuàng)建了一個(gè)相應(yīng)的文件夾:
hive> dfs -ls /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113; Found 1 items drwxr-xr-x - ticketdev ticketdev 0 2014-11-13 17:50 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=jilin h
每一個(gè)分區(qū)都會(huì)有一個(gè)獨(dú)立的文件夾,在這個(gè)例子中stat_date是主文件夾,province是子文件夾,如:
hive> alter table partition_test add partition (stat_date='20141113',province='beijing'); OK Time taken: 0.119 seconds hive> dfs -ls /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/; Found 2 items drwxr-xr-x - ticketdev ticketdev 0 2014-11-13 18:06 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=beijing drwxr-xr-x - ticketdev ticketdev 0 2014-11-13 17:50 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=jilin
基本知識(shí)介紹到這里,下面開始插入數(shù)據(jù)。我使用一個(gè)輔助的非分區(qū)表partition_test_input準(zhǔn)備向partition_test中插入數(shù)據(jù):
hive> desc partition_test_input; OK stat_date string member_id string name string province string hive> select * from partition_test_input; OK20110526 1 liujiannan liaoning20110526 2 wangchaoqun hubei20110728 3 xuhongxing sichuan20110728 4 zhudaoyong henan20110728 5 zhouchengyu heilongjiang
然后我向partition_test的分區(qū)中插入數(shù)據(jù):
hive> insert overwrite table partition_test partition(stat_date='20110728',province='henan') select member_id,name from partition_test_input where stat_date='20141113' and province='beijing'; Total MapReduce jobs = 2...1 Rows loaded to partition_test OK
還可以同時(shí)向多個(gè)分區(qū)插入數(shù)據(jù):
hive>> from partition_test_input> insert overwrite table partition_test partition (stat_date='20110526',province='liaoning')> select member_id,name where stat_date='20110526' and province='liaoning'> insert overwrite table partition_test partition (stat_date='20110728',province='sichuan')> select member_id,name where stat_date='20110728' and province='sichuan'> insert overwrite table partition_test partition (stat_date='20110728',province='heilongjiang')> select member_id,name where stat_date='20110728' and province='heilongjiang'; Total MapReduce jobs = 4...3 Rows loaded to partition_test OK
特別要注意,在其他數(shù)據(jù)庫中,一般向分區(qū)表中插入數(shù)據(jù)時(shí)系統(tǒng)會(huì)校驗(yàn)數(shù)據(jù)是否符合該分區(qū),如果不符合會(huì)報(bào)錯(cuò)。而在hive中,向某個(gè)分區(qū)中插入什么樣的數(shù)據(jù)完全是由人來控制的,因?yàn)榉謪^(qū)鍵是偽列,不實(shí)際存儲(chǔ)在文件中,如:
hive> insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input; Total MapReduce jobs = 2...5 Rows loaded to partition_test OK hive> select * from partition_test where stat_date='20110527' and province='liaoning'; OK1 liujiannan 20110527 liaoning2 wangchaoqun 20110527 liaoning3 xuhongxing 20110527 liaoning4 zhudaoyong 20110527 liaoning5 zhouchengyu 20110527 liaoning
可以看到在partition_test_input中的5條數(shù)據(jù)有著不同的stat_date和province,但是在插入到partition(stat_date='20110527',province='liaoning')這個(gè)分區(qū)后,5條數(shù)據(jù)的stat_date和province都變成相同的了,因?yàn)檫@兩列的數(shù)據(jù)是根據(jù)文件夾的名字讀取來的,而不是實(shí)際從數(shù)據(jù)文件中讀取來的:
$ hadoop fs -cat /user/hive/warehouse/partition_test/stat_date=20110527/province=liaoning/000000_01,liujiannan2,wangchaoqun3,xuhongxing4,zhudaoyong5,zhouchengyu
下面介紹一下動(dòng)態(tài)分區(qū),因?yàn)榘凑丈厦娴姆椒ㄏ蚍謪^(qū)表中插入數(shù)據(jù),如果源數(shù)據(jù)量很大,那么針對(duì)一個(gè)分區(qū)就要寫一個(gè)insert,非常麻煩。況且在之前的版本中,必須先手動(dòng)創(chuàng)建好所有的分區(qū)后才能插入,這就更麻煩了,你必須先要知道源數(shù)據(jù)中都有什么樣的數(shù)據(jù)才能創(chuàng)建分區(qū)。
使用動(dòng)態(tài)分區(qū)可以很好的解決上述問題。動(dòng)態(tài)分區(qū)可以根據(jù)查詢得到的數(shù)據(jù)自動(dòng)匹配到相應(yīng)的分區(qū)中去。
使用動(dòng)態(tài)分區(qū)要先設(shè)置hive.exec.dynamic.partition參數(shù)值為true,默認(rèn)值為false,即不允許使用:
hive> set hive.exec.dynamic.partition; hive.exec.dynamic.partition=false hive> set hive.exec.dynamic.partition=true; hive> set hive.exec.dynamic.partition; hive.exec.dynamic.partition=true
動(dòng)態(tài)分區(qū)的使用方法很簡單,假設(shè)我想向stat_date='20110728'這個(gè)分區(qū)下面插入數(shù)據(jù),至于province插入到哪個(gè)子分區(qū)下面讓數(shù)據(jù)庫自己來判斷,那可以這樣寫:
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叫做靜態(tài)分區(qū)列,province叫做動(dòng)態(tài)分區(qū)列。select子句中需要把動(dòng)態(tài)分區(qū)列按照分區(qū)的順序?qū)懗鰜恚o態(tài)分區(qū)列不用寫出來。這樣stat_date='20110728'的所有數(shù)據(jù),會(huì)根據(jù)province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夾下,如果源數(shù)據(jù)對(duì)應(yīng)的province子分區(qū)不存在,則會(huì)自動(dòng)創(chuàng)建,非常方便,而且避免了人工控制插入數(shù)據(jù)與分區(qū)的映射關(guān)系存在的潛在風(fēng)險(xiǎn)。
注意,動(dòng)態(tài)分區(qū)不允許主分區(qū)采用動(dòng)態(tài)列而副分區(qū)采用靜態(tài)列,這樣將導(dǎo)致所有的主分區(qū)都要?jiǎng)?chuàng)建副分區(qū)靜態(tài)列所定義的分區(qū):
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'
動(dòng)態(tài)分區(qū)可以允許所有的分區(qū)列都是動(dòng)態(tài)分區(qū)列,但是要首先設(shè)置一個(gè)參數(shù)hive.exec.dynamic.partition.mode :
hive> set hive.exec.dynamic.partition.mode; hive.exec.dynamic.partition.mode=strict
它的默認(rèn)值是strick,即不允許分區(qū)列全部是動(dòng)態(tài)的,這是為了防止用戶有可能原意是只在子分區(qū)內(nèi)進(jìn)行動(dòng)態(tài)建分區(qū),但是由于疏忽忘記為主分區(qū)列指定值了,這將導(dǎo)致一個(gè)dml語句在短時(shí)間內(nèi)創(chuàng)建大量的新的分區(qū)(對(duì)應(yīng)大量新的文件夾),對(duì)系統(tǒng)性能帶來影響。所以我們要設(shè)置:
hive> set hive.exec.dynamic.partition.mode=nostrick;
再介紹3個(gè)參數(shù):
hive.exec.max.dynamic.partitions.pernode (缺省值100):每一個(gè)mapreduce job允許創(chuàng)建的分區(qū)的最大數(shù)量,如果超過了這個(gè)數(shù)量就會(huì)報(bào)錯(cuò)
hive.exec.max.dynamic.partitions (缺省值1000):一個(gè)dml語句允許創(chuàng)建的所有分區(qū)的最大數(shù)量
hive.exec.max.created.files (缺省值100000):所有的mapreduce job允許創(chuàng)建的文件的最大數(shù)量
關(guān)于hive中怎么實(shí)現(xiàn)動(dòng)態(tài)分區(qū)和靜態(tài)分區(qū)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。