一起學Hive 之六 Hive的動態分割槽

2021-08-22 11:42:09 字數 2574 閱讀 7914

前面文章介紹了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,...