往hive分割槽表中插入資料時,如果需要建立的分割槽很多,比如以表中某個字段進行分割槽儲存,則需要複製貼上修改很多sql去執行,效率低。hive提供了乙個動態分割槽功能,其可以基於查詢引數的位置去推斷分割槽的名稱,從而建立分割槽。
一、單一分割槽字段動態分割槽表的建立與資料插入
1、建表
drop table if exists tmp.tmp_user_push_dynamic_partition;
create table tmp.tmp_user_push_dynamic_partition(
userinfo_id bigint comment '使用者id',
name string comment '姓名',
idcode string comment '身份證號',
birthday string comment '生日',
*** int comment '性別')
comment '使用者標籤寬表'
partitioned by (
age int)
row format serde
'org.apache.hadoop.hive.ql.io.orc.orcserde'
stored as inputformat
'org.apache.hadoop.hive.ql.io.orc.orcinputformat'
outputformat
'org.apache.hadoop.hive.ql.io.orc.orcoutputformat'
tblproperties (
2、設定可以使用動態分割槽的引數
set hive.exec.dynamic.partition=true; #開啟動態分割槽,預設是false也可以設定最多分割槽等:set hive.exec.dynamic.partition.mode=nonstrict; #開啟允許所有分割槽都是動態的,否則必須要有靜態分割槽才能使用
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=2048;
set hive.exec.max.dynamic.partitions.pernode=256;
set hive.exec.dynamic.partition.mode=nonstrict;
3、向動態分割槽表插入資料
insert overwrite table tmp.tmp_user_push_dynamic_partition partition(age)
select userinfo_id,name,idcode,birthday,***,age
from dwf.dwf_user_push_personas_full_1d
where idcode is not null
limit 10000;
要點:系統預設以最後乙個字段【age】為分割槽名,因為分割槽表的分割槽字段預設也是該表中的字段,且依次排在表中字段的最後面。所以分割槽的字段只能放在後面,不能把順序弄錯。
如果我們查詢了7個字段的話,則會報錯,因為該錶加上分割槽欄位也才6個。系統是根據查詢欄位的位置推斷分割槽名的,而不是欄位名稱。
使用,insert...select 往表中匯入資料時,查詢的字段個數必須和目標的字段個數相同,不能多,也不能少,否則會報錯。
4、分割槽及資料查驗
hive> show partitions tmp.tmp_user_push_dynamic_partition;
okage=-124
age=-128
age=-30
age=-32
age=-35
age=-38
age=-41
age=-45
age=-51
age=-53
age=-58
age=-62
age=-66
age=-76
age=-82
age=100
age=101
age=103
age=11
age=116
age=125
age=13
age=16
age=18
age=19
age=20
age=21
age=22
age=23
age=24
age=25
age=26
age=27
age=28
age=29
age=30
age=31
age=32
age=33
age=34
age=35
age=36
age=37
age=38
age=39
age=40
age=41
age=42
age=43
age=44
age=45
age=46
age=47
age=48
age=49
age=5
age=50
age=51
age=52
age=53
age=54
age=55
age=56
age=57
age=58
age=59
age=60
age=61
age=62
age=63
age=64
age=65
age=66
age=67
age=68
age=69
age=7
age=70
age=71
age=72
age=74
age=76
age=78
age=81
age=82
age=__hive_default_partition__
time taken: 0.073 seconds, fetched: 86 row(s)
hive> select * from tmp.tmp_user_push_dynamic_partition where age=20;
ok245964 蓋智偉 211303199910199999 1999-10-19 1 20
239910 林單 352224199908179999 1999-08-17 1 20
228741 馬曉宇 370181199905249999 1999-05-24 0 20
225516 小懶豬 330211199906019999 1999-06-01 0 20
224127 馬文 372901199910109999 1999-10-10 1 20
162135 曹越 310113199906159999 1999-06-15 1 20
102150 徐子驍 332527199912319999 1999-12-31 1 20
76200 趙莊羽 310104199911089999 1999-11-08 1 20
time taken: 0.15 seconds, fetched: 8 row(s)
二、多個分割槽字段半自動分割槽
多個分割槽欄位時,實現半自動分割槽(部分字段靜態分割槽,注意靜態分割槽欄位要在動態前面),單分割槽欄位的動態分割槽都不建議使用,混合的就不做過多延伸了。
三、動態分割槽表的屬性
使用動態分割槽表必須配置的引數 :
set hive.exec.dynamic.partition =true(預設false),表示開啟動態分割槽功能
set hive.exec.dynamic.partition.mode = nonstrict(預設strict),表示允許所有分割槽都是動態的,否則必須有靜態分割槽字段
set hive.exec.max.dynamic.partitions.pernode=100 (預設100,一般可以設定大一點,比如1000)表示每個maper或reducer可以允許建立的最大動態分割槽個數,預設是100,超出則會報錯。
set hive.exec.max.dynamic.partitions =1000(預設值) 表示乙個動態分割槽語句可以建立的最大動態分割槽個數,超出報錯
set hive.exec.max.created.files =10000(預設) 表示全域性可以建立的最大檔案個數,超出報錯。
Hive動態分割槽使用
動態分割槽可以即時給表新增分割槽,不用通過修改sql實現。允許在插入的時候指定分割槽,分割槽欄位為插入時字段的位置決定。例如 from page view stg pvs insert overwrite table page view partition dt 2008 06 08 country...
Hive 動態分割槽使用
hive 動態分割槽與靜態分割槽,靜態分割槽需要制定分割槽欄位的值插入分割槽資料,動態分割槽可以根據分割槽欄位的值自動插入對應分割槽 靜態分割槽 須指定分割槽欄位的值 insert overwrite table test.tmp edw customer event detail di parti...
Hive 動態分割槽的使用
set hive.exec.dynamic.partition true set hive.exec.dynamic.partition.mode nonstrict 預設是strict嚴格模式,至少要有乙個靜態分割槽。將下表按照location進行分割槽 建立分割槽表 create table d...