關係型資料庫中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中。hive中也提供了類似的機制,即動態分割槽(dynamic partition),只不過,使用hive的動態分割槽,需要進行相應的配置。
以第乙個表的分割槽規則,來對應第二個表的分割槽規則,將第乙個表的所有分割槽,全部拷貝到第二個表中來,第二個表在載入資料的時候,不需要指定分割槽了,直接用第乙個表的分割槽即可。
(1)開啟動態分割槽功能(預設true,開啟)
set hive.
exec
.dynamic.
partition
=true
;
(2)設定為非嚴格模式(動態分割槽的模式,預設strict,表示必須指定至少乙個分割槽為靜態分割槽,nonstrict模式表示允許所有的分割槽欄位都可以使用動態分割槽。)
set hive.
exec
.dynamic.
partition
.mode
=nonstrict;
(3)在所有執行mr的節點上,最大一共可以建立多少個動態分割槽。
set hive.
exec
.max.dynamic.partitions=
1000
;
(4)在每個執行mr的節點上,最大可以建立多少個動態分割槽。該引數需要根據實際的資料來設定。比如:源資料中包含了一年的資料,即day欄位有365個值,那麼該引數就需要設定成大於365,如果使用預設值100,則會報錯。
set hive.
exec
.max.dynamic.partitions.pernode=
100;
(5)整個mr job中,最大可以建立多少個hdfs檔案。
在linux系統當中,每個linux使用者最多可以開啟1024個程序,每乙個程序最多可以開啟2048個檔案,即持有2048個檔案控制代碼,下面這個值越大,就可以開啟檔案控制代碼越大
set hive.
exec
.max.created.files=
100000
;
(6)當有空分割槽生成時,是否丟擲異常。一般不需要設定。
set hive.error.
on.empty.
partition
=false
;
需求:將ori中的資料按照時間(如:20111231234568),插入到目標表ori_partitioned的相應分割槽中。
(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'
;load
data
local inpath '/export/servers/hivedatas/small_data'
into
table ori_partitioned partition
(p_time=
'20111230000010');
load
data
local inpath '/export/servers/hivedatas/small_data'
into
table ori_partitioned partition
(p_time=
'20111230000011'
);
(2)建立分割槽表
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'
;
(3)分析
如果按照之前介紹的往指定乙個分割槽中insert資料,那麼這個需求很不容易實現。這時候就需要使用動態分割槽來實現。
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
;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;
注意:在partition (month,day)中指定分割槽欄位名即可;
在select子句的最後幾個字段,必須對應前面partition (month,day)中指定的分割槽字段,包括順序。
檢視分割槽
hive> show partitions ori_partitioned_target;
okp_time=20111230000010
p_time=20111230000011
Hive 調優 分割槽裁剪 列裁剪
在select中,只拿需要的列,如果有,盡量使用分割槽過濾,少用select 在分割槽剪裁中,當使用外關聯時,如果將副表的過濾條件寫在where後面,那麼就會先全表關聯,之後再過濾,比如 create table ori id bigint time bigint uid string,keywor...
第九章 Hive企業級調優之動態分割槽調整
關係型資料庫中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽 dynamic partition 只不過,使用hive的動態分割槽,需要進行相應的配置。1 開啟動態分割槽引數設定 1 開啟動態分割槽功能 預設t...
hive效能調優
原文 limit 限制調整 因為使用 limit 語句時候,是先執行整個查詢語句,然後再返回部分結果的 set hive.limit.optimize.enable true set hive.limit.row.max.size 10000 set hive.limit.optimize.limi...