1. 程式人生 > >Hive的靜態分區和動態分區

Hive的靜態分區和動態分區

操作 mage 分區 ive 作者 over rom for top

作者:Syn良子 出處:http://www.cnblogs.com/cssdongl/p/6831884.html 轉載請註明出處

雖然之前已經用過很多次hive的分區表,但是還是找時間快速回顧總結一下加深理解.

舉個栗子,基本需求就是Hive有一張非常詳細的原子數據表original_device_open,而且還在不斷隨著時間增長,那麽我需要給它進行分區,為什麽要分區?因為我想縮小查詢範圍,提高速度和性能.

分區其實是物理上對hdfs不同目錄進行數據的load操作,0.7之後的版本都會自動創建不存在的hdfs的目錄,不同的目錄對應不同的分區字段,當然會有一個處於最頂層的主分區字段.

我這裏的分區字段主要是時間,分為年,月,日,時

首先建立一個新的分區表(這裏我不在原始數據表直接操作)

CREATE TABLE device_open (
deviceid varchar(50),
...
)
PARTITIONED BY (year varchar(50),month varchar(50),day varchar(50),hour varchar(50))
ROW FORMAT DELIMITED FIELDS TERMINATED BY \t;

然後我要從原始表中select數據插入到新建的分區表中去,如下采用動態插入(…代表省略的字段)

set hive.exec.dynamic.partition=true;
set
hive.exec.dynamic.partition.mode=nonstrict; insert overwrite table device_open partition(year,month,day,hour) select ..., original_device_open.year as year, original_device_open.month as month, original_device_open.day as day, original_device_open.hour as hour FROM original_device_open

簡單解釋下

set hive.exec

.dynamic.partition=true; 是開啟動態分區

set hive.exec.dynamic.partition.mode=nonstrict; 這個屬性默認值是strict,就是要求分區字段必須有一個是靜態的分區值,隨後會講到,當前設置為nonstrict,那麽可以全部動態分區

其他相關屬性見下表

技術分享

註意代碼中標紅的部分,partition(year,month,day,hour) 就是要動態插入的分區.

代碼執行後一直卡在map百分比90%處,然後重試了都失敗,查看後發現如下日誌

Fatal error occurred when node tried to create too many dynamic partitions.

技術分享

很明顯的錯誤,太多動態分區了,因為 hive.exec.max.dynamic.partitions默認值是1000,而我這裏的分區我確定肯定超過這個值了,那麽修改如下

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions=100000;
SET hive.exec.max.dynamic.partitions.pernode=100000;

重新執行insert分區代碼,插入成功.

當然,對於大批量數據的插入分區,動態分區相當方便,對於小批量的分區插入,比如想定時每天執行某個時間段的分區數據插入,那也很簡單,如下代碼

insert overwrite table device_open partition(year=2017,month=05,day,hour)
select
...,
original_device_open.day as day,
original_device_open.hour as hour
FROM original_device_open where original_device_open.year=2017 and original_device_open.month=05

註意 partition(year=2017,month=05,day,hour)

我只需要指明需要靜態分區的字段值就可以.剩下的字段就屬於動態分區了,這裏指將2017年5月份的數據插入分區表,對應底層的物理操作就是講2017年5月份的數據load到

hdfs上對應2017年5月份下的所有day和hour目錄中去.

Hive的靜態分區和動態分區