分區是在處理大型事實表時經常使用的方法。分區的好處在於縮小查詢掃描範圍,從而提升速度。分區分爲兩種:靜態分區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
注意首先須要在hive語句中設置容許動態分區。即:
[sql] view plaincopy
可是這還不夠,在動態分區有可能很大的狀況下,還須要其餘的調整: 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