關係型資料庫中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽(dynamic partition),只不過,使用hive的動態分割槽,需要進行相應的配置。
1.開啟動態分割槽引數設定
(1)開啟動態分割槽功能(預設true,開啟)
hive.
exec
.dynamic.
partition
=true
(2)設定為非嚴格模式(動態分割槽的模式,預設strict,表示必須指定至少乙個分割槽為靜態分割槽,nonstrict模式表示允許所有的分割槽欄位都可以使用動態分割槽。)
hive.
exec
.dynamic.
partition
.mode
=nonstrict
(3)在所有執行mr的節點上,最大一共可以建立多少個動態分割槽。
hive.
exec
.max.dynamic.partitions=
1000
(4)在每個執行mr的節點上,最大可以建立多少個動態分割槽。該引數需要根據實際的資料來設定。比如:源資料中包含了一年的資料,即day欄位有365個值,那麼該引數就需要設定成大於365,如果使用預設值100,則會報錯。
hive.
exec
.max.dynamic.partitions.pernode=
100
(5)整個mr job中,最大可以建立多少個hdfs檔案。
hive.
exec
.max.created.files=
100000
(6)當有空分割槽生成時,是否丟擲異常。一般不需要設定。
hive.error.
on.empty.
partition
=false
2.案例實操
需求:將ori中的資料按照時間(如:20111230000008),插入到目標表ori_partitioned_target的相應分割槽中。
(1)建立分割槽表
create
table ori_partitioned(id bigint
,time
bigint
, uid string, keyword string,
url_rank int
, click_num int
, click_url string)
partitioned by
(p_time bigint
)row format delimited fields
terminated
by'\t'
;
(2)載入資料到分割槽表中
hive (
default
)>
load
data
local inpath '/home/wyh/ds1'
into
table
ori_partitioned partition
(p_time=
'20111230000010');
hive (
default
)>
load
data
local inpath '/home/wyh/ds2'
into
table ori_partitioned partition
(p_time=
'20111230000011'
);
(3)建立目標分割槽表
create
table ori_partitioned_target(id bigint
,time
bigint
, uid string,
keyword string, url_rank int
, click_num int
, click_url string) partitioned by
(p_time string)
row format delimited fields
terminated
by'\t'
;
(4)設定動態分割槽
set hive.
exec
.dynamic.
partition
=true
;set hive.
exec
.dynamic.
partition
.mode
= nonstrict;
set hive.
exec
.max.dynamic.partitions =
1000
;set hive.
exec
.max.dynamic.partitions.pernode =
100;
set hive.
exec
.max.created.files =
100000
;set hive.error.
on.empty.
partition
=false
;hive (
default
)>
insert overwrite table ori_partitioned_target partition
(p_time)
select id,
time
, uid, keyword, url_rank, click_num, click_url, p_time from ori_partitioned;
(5)檢視目標分割槽表的分割槽情況
hive (
default
)>
show partitions ori_partitioned_target;
第九章 Hive企業級調優之小表 大表Join
將key相對分散,並且資料量小的表放在join的左邊,這樣可以有效減少記憶體溢位錯誤發生的機率 再進一步,可以使用map join讓小的維度表 1000條以下的記錄條數 先進記憶體。在map端完成reduce。實際測試發現 新版的hive已經對小表join大表和大表join小表進行了優化。小表放在左...
第九章 Hive企業級優化之推測執行
在分布式集群環境下,因為程式bug 包括hadoop本身的bug 負載不均衡或者資源分布不均等原因,會造成同乙個作業的多個任務之間執行速度不一致,有些任務的執行速度可能明顯慢於其他任務 比如乙個作業的某個任務進度只有50 而其他所有任務已經執行完畢 則這些任務會拖慢作業的整體執行進度。為了避免這種情...
第九章 Hive企業級優化之並行執行
hive會將乙個查詢轉化成乙個或者多個階段。這樣的階段可以是mapreduce階段 抽樣階段 合併階段 limit階段。或者hive執行過程中可能需要的其他階段。預設情況下,hive一次只會執行乙個階段。不過,某個特定的job可能包含眾多的階段,而這些階段可能並非完全互相依賴的,也就是說有些階段是可...