2015-11-03 114 views
0

我在蜂巢中創建一個表,動態分區如下動態分區

create table sample(uuid String,date String,Name String,EmailID String,Comments String,CompanyName String,country String,url String,keyword String,source String) PARTITIONED BY (id String) Stored as parquet; 

我也有設置在蜂巢外殼

set hive.exec.dynamic.partition=true; 
set hive.exec.dynamic.partition.mode=nonstrict; 
set hive.exec.max.dynamic.partitions=100000000; 
set hive.exec.max.dynamic.partitions.pernode=100000000; 
set hive.exec.max.created.files = 100000000; 

下這是一個很好的做法,因爲我如上所示爲每個動態分區配置設置1億個值?

回答

0

動態分區設計爲那些表,它們將具有新的分區值。如果你的表受到INSERT子句的影響,那麼它就是okey,如果你沒有動態分區,你必須執行另一個查詢來創建新分區,或者你必須知道它們之前的值:

FROM page_view_stg pvs 
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='US') 
    SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'US' 

official Hive tutorial你可以檢查一個例子。

分區的最佳實踐與存儲的數據種類有關。例如:

  • 這是不可推薦使用像ID這樣的唯一值。 (如果每行都有不同的id值,這是一個不好的做法)
  • 數據必須有足夠的分散性,如果分區有幾個不同的值(如使用布爾字段或類似的),這是一個不好的做法。
+0

嗨米格爾..謝謝你的迴應,但我想存儲我的數據在動態分區存儲像/output/id=100/data.parquet相同的格式。有什麼辦法可以做到這一點? – wazza

+0

嗨,理論上分區數據(獨立的,如果它是分區或動態分區)總是像我的意思(partitioning_field = value/data.paquet)存儲。 動態地只引用Hive並不需要你明確指定字段分區的值使用常量值(例如字符串),而是hive可以從另一個字段值中檢索它。 – Miguel

+0

是的我知道我想基於id值存儲它。你已經指定使用id作爲分區對於配置單元是一個不好的做法。所以我問是否有任何其他方式來實現像這樣可能是java mapreduce,pig等e – wazza