1. 程式人生 > >動態分割槽最佳實踐(一定要注意實踐場景)

動態分割槽最佳實踐(一定要注意實踐場景)

HIVE動態分割槽實戰

2015年06月17日 20:44:50 opensure 閱讀數:16753 標籤: hive動態分割槽 更多

個人分類: hive

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/opensure/article/details/46537969

一)hive中支援兩種型別的分割槽:

  • 靜態分割槽SP(static partition)
  • 動態分割槽DP(dynamic partition)

靜態分割槽與動態分割槽的主要區別在於靜態分割槽是手動指定,而動態分割槽是通過資料來進行判斷。詳細來說,靜態分割槽的列實在編譯時期,通過使用者傳遞來決定的;動態分割槽只有在SQL執行時才能決定。

二)實戰演示如何在hive中使用動態分割槽

1、建立一張分割槽表,包含兩個分割槽dt和ht表示日期和小時

 
  1. CREATE TABLE partition_table001

  2. (

  3. name STRING,

  4. ip STRING

  5. )

  6. PARTITIONED BY (dt STRING, ht STRING)

  7. ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

2、啟用hive動態分割槽,只需要在hive會話中設定兩個引數:

 

 
  1. set hive.exec.dynamic.partition=true;

  2. set hive.exec.dynamic.partition.mode=nonstrict;

 

3、把partition_table001表某個日期分割槽下的資料load到目標表partition_table002
使用靜態分割槽時,必須指定分割槽的值,如:

 
  1. create table if not exists partition_table002 like partition_table001;

  2. insert overwrite table partition_table002 partition (dt='20150617', ht='00') select name, ip from partition_table001 where dt='20150617' and ht='00';

此時我們發現一個問題,如果希望插入每天24小時的資料,則需要執行24次上面的語句。而動態分割槽會根據select出的結果自動判斷資料改load到哪個分割槽中去。

4、使用動態分割槽

insert overwrite table partition_table002 partition (dt, ht) select * from partition_table001 where dt='20150617';

hive先獲取select的最後兩個位置的dt和ht引數值,然後將這兩個值填寫到insert語句partition中的兩個dt和ht變數中,即動態分割槽是通過位置來對應分割槽值的。原始表select出來的值和輸出partition的值的關係僅僅是通過位置來確定的,和名字並沒有關係,比如這裡dt和st的名稱完全沒有關係。
只需要一句SQL即可把20150617下的24個ht分割槽插到了新表中。

三)靜態分割槽和動態分割槽可以混合使用
1、全部DP

 
  1. INSERT OVERWRITE TABLE T PARTITION (ds, hr)

  2. SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10;

2、DP/SP結合

 
  1. INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)

  2. SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;

3、當SP是DP的子分割槽時,以下DML會報錯,因為分割槽順序決定了HDFS中目錄的繼承關係,這點是無法改變的

 
  1. -- throw an exception

  2. INSERT OVERWRITE TABLE T PARTITION (ds, hr = 11)

  3. SELECT key, value, ds/*, hr*/ FROM srcpart WHERE ds is not null and hr=11;

4、多張表插入

 
  1. FROM S

  2. INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)

  3. SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10

  4. INSERT OVERWRITE TABLE R PARTITION (ds='2010-03-03, hr=12)

  5. SELECT key, value, ds, hr from srcpart where ds is not null and hr = 12;

  6.  

5、CTAS,(CREATE-AS語句),DP與SP下的CTAS語法稍有不同,因為目標表的schema無法完全的從select語句傳遞過去。這時需要在create語句中指定partition列

 
  1. CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS

  2. SELECT key, value, ds, hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;

6、上面展示了DP下的CTAS用法,如果希望在partition列上加一些自己的常量,可以這樣做

 
  1. CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS

  2. SELECT key, value, "2010-03-03", hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;


四)小結:
通過上面的案例,我們能夠發現使用hive中的動態分割槽特性的最佳實踐:對於那些存在很大數量的二級分割槽的表,使用動態分割槽可以非常智慧的載入表,而在動靜結合使用時需要注意靜態分割槽值必須在動態分割槽值的前面