對現有Hive的大表進行動態分區

分區是在處理大型事實表時經常使用的方法。分區的好處在於縮小查詢掃描範圍,從而提升速度。分區分爲兩種:靜態分區static partition和動態分區dynamic partition。靜態分區和動態分區的區別在於導入數據時,是手動輸入分區名稱,仍是經過數據來判斷數據分區。對於大數據批量導入來講,顯然採用動態分區更爲簡單方便。node

- 對現存hive表的分區sql

首先,新建一張咱們須要的分區之後的表create table like 'origin'數據庫

若現存hive表中沒有分區信息,咱們須要手動修改hive配置數據庫來 增長hive表的分區信息。hive表分區存在PARTITION_KEYS數據表中,其中表項的| TBL_ID | PKEY_COMMENT | PKEY_NAME | PKEY_TYPE | INTEGER_IDX |分別是hive表名(在TBLS中存儲),備註,分區名,分區索引的順序。創建完成後咱們就有一張相似於原始表,可是帶有分區的表。apache

而後,咱們修改一下hive的默認設置以支持動態分區:app

set hive.exec.dynamic.partition=true;函數

set hive.exec.dynamic.partition.mode=nonstrict; 大數據

第二步僅在你僅使用動態分區字段作分區索引時。spa

而後用hive的insert命令進行插入操做。注意,除了全部列外,須要將分區的動態字段跟在後面。.net

INSERT OVERWRITE TABLE target PARTITION (dt) 
SELECT id,user_id,app_id,time,ip,substr(time,0,10) FROM origin orm

能夠看到,動態分區的字段支持函數操做。

這樣,咱們獲得了一張分區後的hive大表。

在hive中,有時候會但願根據輸入的key,把結果自動輸出到不一樣的目錄中,這能夠經過動態分區來實現,就是把每個key看成一個分區,代碼示例以下:

[sql] view plaincopy

  1. set hive.exec.dynamic.partition=true;  
  2. set hive.exec.dynamic.partition.mode=nonstrict;  
  3.   
  4.   
  5. set hive.exec.dynamic.partitions.pernode=50000;  
  6. set hive.exec.dynamic.partitions.partitions=50000;  
  7. set hive.exec.max.created.files=500000;  
  8. set mapred.reduce.tasks =20000;  
  9. set hive.merge.mapfiles=true;  
  10.   
  11. drop table itemset;  
  12. create table itemset(  
  13. auctions string)  
  14. partitioned by (category_id string)  
  15. row format delimited  
  16. fields terminated by '\t'  
  17. stored as textfile  
  18. location '/data/itemset';  
  19.   
  20. insert overwrite table itemset partition(category_id)  
  21. select auctions, category_id from source_table distribute by category_id;  


注意首先須要在hive語句中設置容許動態分區。即:
 

[sql] view plaincopy

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

可是這還不夠,在動態分區有可能很大的狀況下,還須要其餘的調整: hive.exec.dynamic.partitions.pernode 參數指的是每一個節點上可以生成的最大分區,這個在最壞狀況下應該是跟最大分區同樣的值 hive.exec.dynamic.partitions.partitions 參數指的是總共的最大的動態分區數 hive.exec.max.created.files 參數指的是可以建立的最多文件數(分區一多,文件必然就多了...) 最後要注意的是select語句中要把distribute的key也select出來 參考:https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-DynamicpartitionInsert

相關文章
相關標籤/搜索