前面文章介紹了hive中是支援分割槽的。
關係型資料庫(如oracle)中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽(dynamic partition),只不過,使用hive的動態分割槽,需要進行相應的配置。
先看乙個應用場景,源表t_lxw1234的資料如下:
select day,url from t_lxw1234;
2015-05-10 url1
2015-05-10 url2
2015-06-14 url1
2015-06-14 url2
2015-06-15 url1
2015-06-15 url2……
目標表為:
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;
okmonth=2015-05/day=2015-05-10
month=2015-06/day=2015-06-14
month=2015-06/day=2015-06-15
一起學Hive 之六 Hive的動態分割槽
hive hive動態分割槽 前面文章介紹了hive中是支援分割槽的。關係型資料庫 如oracle 中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽 dynamic partition 只不過,使用hive的動...
一起學Hive 之八 使用Hive命令列
hive提供的幾種使用者互動介面中,最常用的就是命令列介面。本文簡單介紹一下hive命令列介面 hive command line 及hive互動shell hive interactive shell 的一些使用。輸入 hive home bin hive h 或者 help可以顯示幫助選項 d,...
一起學Hive 之八 使用Hive命令列
hive提供的幾種使用者互動介面中,最常用的就是命令列介面。本文簡單介紹一下hive命令列介面 hive command line 及hive互動shell hive interactive shell 的一些使用。輸入 hive home bin hive h 或者 help可以顯示幫助選項 d,...