Hive查詢結果批量插入分區


在hive的數據建表時,為了查詢的高效性,我們經常會對表建立分區,例如下面的表

create external table dm_fan_photo_icf_basic(user string, item string, hot int) 
PARTITIONED BY (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as textfile
location '/user/hive/fan/photo/icf/basic/';

這是一個外部表,以(day)作為分區,在一般情況下,要插入新的數據必須要指定分區,例如

insert into table dm_fan_photo_icf_basic
PARTITIONED BY (day = '20130620')
select * from table_test where day = 20130620;

上面會把表table_test里面字段day = 20130620的數據插入到表dm_fan_photo_icf_basic中,並為這些新數據建立一個分區有時候要插入的數據可能不止一天,可能是一個月,這時候按照常規情況下就要寫多個sql,然后把分區字段名改成相應的日期,一方面代碼不簡潔,另一方面這需要啟動多個job,且沒有充分利用集群的優勢,如果能一次性把所有數據都插入不同分區,那么效率就提上來了,如果要把table_test表里面20130620至當天的數據插入表dm_fan_photo_icf_basic中,並且要對應到相應的分區,此時,可利用如下的方面

set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
insert into table dm_fan_photo_icf_basic
PARTITIONED BY (day)
select * from table_test where day >= 20130620
distribute by day;

其中前倆個設置是必須的,因為這是一種動態分區插入,在默認情況下是靜態的

最后面的distribute by day也是必須的,這是指定了分區


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM