作者: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目錄中去.