hive動態分割槽使用 如非必須,不建議使用

2021-09-28 17:03:20 字數 4630 閱讀 9785

往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...