前面文章介紹了hive中是支援分割槽的。
關係型資料庫(如oracle)中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽(dynamic partition),只不過,使用hive的動態分割槽,需要進行相應的配置。
先看乙個應用場景,源表t_lxw1234的資料如下:
select day,url from t_lxw1234;
2015-05-10url1
2015-05-10url2
2015-06-14url1
2015-06-14url2
2015-06-15url1
2015-06-15url2……
目標表為:
create table t_lxw1234_partitioned (
url string
)partitioned by (month string,day string)
stored as textfile;
需求:將t_lxw1234中的資料按照時間(day),插入到目標表t_lxw1234_partitioned的相應分割槽中。
如果按照之前介紹的往指定乙個分割槽中insert資料,那麼這個需求很不容易實現。
這時候就需要使用動態分割槽來實現,使用動態分割槽需要注意設定以下引數:
預設值:false
是否開啟動態分割槽功能,預設false關閉。
使用動態分割槽時候,該引數必須設定成true;
預設值:strict
動態分割槽的模式,預設strict,表示必須指定至少乙個分割槽為靜態分割槽,nonstrict模式表示允許所有的分割槽欄位都可以使用動態分割槽。
一般需要設定為nonstrict
預設值:100
在每個執行mr的節點上,最大可以建立多少個動態分割槽。
該引數需要根據實際的資料來設定。
比如:源資料中包含了一年的資料,即day欄位有365個值,那麼該引數就需要設定成大於365,如果使用預設值100,則會報錯。
預設值:1000
在所有執行mr的節點上,最大一共可以建立多少個動態分割槽。
同上引數解釋。
預設值:100000
整個mr job中,最大可以建立多少個hdfs檔案。
一般預設值足夠了,除非你的資料量非常大,需要建立的檔案數大於100000,可根據實際情況加以調整。
預設值:false
當有空分割槽生成時,是否丟擲異常。
一般不需要設定。
那麼,上面的需求可以使用如下的語句來完成:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode =1000;
set hive.exec.max.dynamic.partitions=1000;
insert overwrite table t_lxw1234_partitioned partition (month,day)
select url,substr(day,1,7)as month,day
from t_lxw1234;
注意:在partition (month,day)中指定分割槽欄位名即可;
在select子句的最後兩個字段,必須對應前面partition (month,day)中指定的分割槽字段,包括順序。
執行結果如下:
loading data to table liuxiaowen.t_lxw1234_partitioned partition (month=null, day=null)
loading partition
loading partition
loading partition
partition liuxiaowen.t_lxw1234_partitioned stats: [numfiles=1, numrows=2, totalsize=10, rawdatasize=8]
partition liuxiaowen.t_lxw1234_partitioned stats: [numfiles=1, numrows=2, totalsize=10, rawdatasize=8]
partition liuxiaowen.t_lxw1234_partitioned stats: [numfiles=1, numrows=2, totalsize=10, rawdatasize=8]
使用show partitions t_lxw1234_partitioned;檢視目標表有哪些分割槽:
hive> show partitions t_lxw1234_partitioned; ok
month=2015-05/day=2015-05-10
month=2015-06/day=2015-06-14
month=2015-06/day=2015-06-15
HIVE動態分割槽
一 前段時間因為導表需求 從一張表中查詢出資料,按日期分割槽overwrite 到指定分割槽表中 在hive裡面研究了一下自動分割槽。步驟 1 建好所需分割槽表 2 設定分割槽引數?1 2 3 4 sethive.exec.dynamic.partition true 可通過這個語句檢視 sethi...
Hive動態分割槽
動態分割槽指不需要為不同的分割槽新增不同的插入語句,分割槽不確定,需要從資料中獲取。相關引數設定 set hive.exec dynamic partition true 使用動態分割槽 可通過這個語句檢視 set hive.exec dynamic partition set hive.exec ...
hive動態分割槽
不需要為不同的分割槽新增不同的插入語句 分割槽不確定,需要從資料中獲取 幾個引數 set hive.exec dynamic partition true 使用動態分割槽 set hive.exec dynamic partition mode nonstrick 無限制模式,如果模式是strict...