[一起學Hive]之六-Hive的動態分區


前面文章介紹了Hive中是支持分區的。

關系型數據庫(如Oracle)中,對分區表Insert數據時候,數據庫自動會根據分區字段的值,將數據插入到相應的分區中,Hive中也提供了類似的機制,即動態分區(Dynamic Partition),只不過,使用Hive的動態分區,需要進行相應的配置。

先看一個應用場景,源表t_lxw1234的數據如下:

 

  1. SELECT day,url FROM t_lxw1234;
  2. 2015-05-10 url1
  3. 2015-05-10 url2
  4. 2015-06-14 url1
  5. 2015-06-14 url2
  6. 2015-06-15 url1
  7. 2015-06-15 url2
  8. ……
  9.  

 

目標表為:

  1. CREATE TABLE t_lxw1234_partitioned (
  2. url STRING
  3. ) PARTITIONED BY (month STRING,day STRING)
  4. stored AS textfile;
  5.  

需求:將t_lxw1234中的數據按照時間(day),插入到目標表t_lxw1234_partitioned的相應分區中。

如果按照之前介紹的往指定一個分區中Insert數據,那么這個需求很不容易實現。

這時候就需要使用動態分區來實現,使用動態分區需要注意設定以下參數:

  • hive.exec.dynamic.partition

默認值:false

是否開啟動態分區功能,默認false關閉。

使用動態分區時候,該參數必須設置成true;

  • hive.exec.dynamic.partition.mode

默認值:strict

動態分區的模式,默認strict,表示必須指定至少一個分區為靜態分區,nonstrict模式表示允許所有的分區字段都可以使用動態分區。

一般需要設置為nonstrict

  • hive.exec.max.dynamic.partitions.pernode

默認值:100

在每個執行MR的節點上,最大可以創建多少個動態分區。

該參數需要根據實際的數據來設定。

比如:源數據中包含了一年的數據,即day字段有365個值,那么該參數就需要設置成大於365,如果使用默認值100,則會報錯。

  • hive.exec.max.dynamic.partitions

默認值:1000

在所有執行MR的節點上,最大一共可以創建多少個動態分區。

同上參數解釋。

  • hive.exec.max.created.files

默認值:100000

整個MR Job中,最大可以創建多少個HDFS文件。

一般默認值足夠了,除非你的數據量非常大,需要創建的文件數大於100000,可根據實際情況加以調整。

  • hive.error.on.empty.partition

默認值:false

當有空分區生成時,是否拋出異常。

一般不需要設置。

 

那么,上面的需求可以使用如下的語句來完成:

  1. SET hive.exec.dynamic.partition=true;
  2. SET hive.exec.dynamic.partition.mode=nonstrict;
  3. SET hive.exec.max.dynamic.partitions.pernode = 1000;
  4. SET hive.exec.max.dynamic.partitions=1000;
  5.  
  6. INSERT overwrite TABLE t_lxw1234_partitioned PARTITION (month,day)
  7. SELECT url,substr(day,1,7) AS month,day
  8. FROM t_lxw1234;
  9.  

注意:在PARTITION (month,day)中指定分區字段名即可;

在SELECT子句的最后兩個字段,必須對應前面PARTITION (month,day)中指定的分區字段,包括順序。

執行結果如下:

Loading data to table liuxiaowen.t_lxw1234_partitioned partition (month=null, day=null)

Loading partition {month=2015-05, day=2015-05-10}

Loading partition {month=2015-06, day=2015-06-14}

Loading partition {month=2015-06, day=2015-06-15}

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-05, day=2015-05-10} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-14} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-15} 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM