需求:需要建立乙個備份帶分割槽的資料表,拷貝時若採用靜態分割槽方式需要寫n行語句,建議使用動態分割槽,節省大量時間。
hive的分割槽方式:由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。
hive中支援兩種型別的分割槽:靜態分割槽sp(static partition)和動態分割槽dp(dynamic partition)
靜態分割槽與動態分割槽的主要區別在於靜態分割槽是手動指定,而動態分割槽是通過資料來進行判斷。詳細來說,靜態分割槽的列實在編譯時期,通過使用者傳遞來決定的;動態分割槽只有在sql執行時才能決定實戰演示一下如何在hive中使用動態分割槽。
1、建立一張分割槽表,包含兩個分割槽dt和ht表示日期和小時
create
table partition_table001
( name string,
ip string
)partitioned by
(dt string, ht string)
row format delimited fields
terminated
by"\t"
;
2、啟用hive動態分割槽,只需要在hive會話中設定兩個引數:
set hive.
exec
.dynamic.
partition
=true
;set hive.
exec
.dynamic.
partition
.mode
=nonstrict;
【注意】
動態分割槽不允許主分割槽採用動態列而副分割槽採用靜態列,這樣將導致所有的主分割槽都要建立副分割槽靜態列所定義的分割槽。hive.exec.dynamic.partition.mode
它的預設值是strick,即不允許分割槽列全部是動態的,這是為了防止使用者有可能原意是只在子分區內進行動態建分割槽,但是由於疏忽忘記為主分割槽列指定值了,這將導致乙個dml語句在短時間內建立大量的新的分割槽(對應大量新的資料夾),對系統效能帶來影響。
3、把partition_table001表某個日期分割槽下的資料load到目標表partition_table002
使用靜態分割槽時,必須指定分割槽的值,如:
--建立表
create
table
ifnot
exists partition_table002 like partition_table001;
-- 插入資料
insert overwrite table partition_table002 partition
(dt=
'20150617'
, ht=
'00'
)select name, ip from partition_table001 where dt=
'20150617'
and ht=
'00'
;
此時我們發現乙個問題,如果希望插入每天24小時的資料,則需要執行24次上面的語句。而動態分割槽會根據select出的結果自動判斷資料改load到哪個分割槽中去。
4、使用動態分割槽
insert overwrite table partition_table002 partition
(dt, ht)
select
*from partition_table001 where dt=
'20150617'
;
hive先獲取select的最後兩個位置的dt和ht引數值,然後將這兩個值填寫到insert語句partition中的兩個dt和ht變數中,即動態分割槽是通過位置來對應分割槽值的。原始表select出來的值和輸出partition的值的關係僅僅是通過位置來確定的,和名字並沒有關係,比如這裡dt和st的名稱完全沒有關係。
只需要一句sql即可把20150617下的24個ht分割槽插到了新錶中。
)靜態分割槽和動態分割槽可以混合使用
1、全部dp
insert overwrite table t partition
(ds, hr)
select
key,
value
, ds, hr from srcpart where ds is
notnull
and hr>
10;
2、dp/sp結合
insert overwrite table t partition
(ds=
'2010-03-03'
, hr)
select
key,
value
,/*ds,*/ hr from srcpart where ds is
notnull
and hr>
10;
3、當sp是dp的子分割槽時,以下dml會報錯,因為分割槽順序決定了hdfs中目錄的繼承關係,這點是無法改變的
-- throw an exception
insert overwrite table t partition
(ds, hr =11)
select
key,
value
, ds/*, hr*/
from srcpart where ds is
notnull
and hr=
11;
4、多張表插入
from s
insert overwrite table t partition
(ds=
'2010-03-03'
, hr)
select
key,
value
, ds, hr from srcpart where ds is
notnull
and hr>
10insert overwrite table r partition
(ds='2010-03
-03, hr=12)
select
key,
value
, ds, hr from srcpart where ds is
notnull
and hr =
12;
5、ctas,(create-as語句),dp與sp下的ctas語法稍有不同,因為目標表的schema無法完全的從select語句傳遞過去。這時需要在create語句中指定partition列
create
table t (
keyint
,value string) partitioned by
(ds string, hr int)as
select
key,
value
, ds, hr+
1 hr1 from srcpart where ds is
notnull
and hr>
10;
6、上面展示了dp下的ctas用法,如果希望在partition列上加一些自己的常量,可以這樣做
create
table t (
keyint
,value string) partitioned by
(ds string, hr int)as
select
key,
value
,"2010-03-03"
, hr+
1 hr1 from srcpart where ds is
notnull
and hr>
10;
set hive.
exec
.dynamic.
partition
=true
;set hive.
exec
.max.dynamic.partitions=
2000
;set hive.
exec
.max.dynamic.partitions.pernode=
100000
;set hive.
exec
.dynamic.
partition
.mode
=nonstrict;
set hive.
exec
.parallel.thread.number=
264;
通過上面的案例,我們能夠發現使用hive中的動態分割槽特性的最佳實踐:對於那些存在很大數量的二級分割槽的表,使用動態分割槽可以非常智慧型的載入表,而在動靜結合使用時需要注意靜態分割槽值必須在動態分割槽值的前面
參考資料:
HIVE分割槽,靜態分割槽,動態分割槽
分割槽可以大大提公升hive的效能,這裡就要提到數倉的分層 原始資料層,儲存原始收集的資料 數倉明細層,裡面做的是轉換和分析,裡面包含部分的資料清洗的過程 數倉服務層,對外業務的處理,如維度轉 鍵 身份證清洗 會員註冊 清晰 字段合併 空值處理 髒資料處理 ip清晰轉換等 最終業務層 適合做增量表,...
Hive 動態分割槽 靜態分割槽
本文 參考 hive預設是靜態分割槽。但是有時候可能需要動態建立不同的分割槽來區分不同的分類。hive中建立分割槽表沒有什麼複雜的分割槽型別 範圍分割槽 列表分割槽 hash分割槽 混合分割槽等 分割槽列也不是表中的乙個實際的字段,而是乙個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列...
HIVE 動態分割槽與靜態分割槽
hive分割槽,實際上是通過乙個路徑來標識的,而不是在物理資料中。比如每天的資料,可能分割槽是pt 20121023這樣,那麼路徑中它就會變成 hdfs path pt 20121023 data files。通過路徑來標識的好處是,如果我們需要取特定分割槽的資料,只需要把這個路徑下的資料取出來就可...