Hive 調優 動態分割槽調整

2021-10-01 02:59:46 字數 3401 閱讀 7140

關係型資料庫中,對分割槽表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...