Hive的靜態分區和動態分區


作者: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,那么可以全部動態分區

其他相關屬性見下表

hivePartitionParams

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

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

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

hiveDynamic

 

很明顯的錯誤,太多動態分區了,因為 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目錄中去.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM