2012-06-12 66 views
2

我使用配置單元(與外部表)處理存儲在亞馬遜S3上的數據。Hive Table添加分區以加載所有子目錄

我的數據被劃分如下: group/team/dt/(例如,數據文件可以被存儲在一個路徑group=myGroup/team=myTeam/dt=20120603

我想處理用於幾個團隊數據(在不同的基團)。 由於RCOVER PARTITIONS需要很長時間,因此我希望將基於組和團隊值的多個分區添加到配置單元表(即給定該團隊中所有可用日期的組和團隊負載數據)。

我正在尋找的功能是:

CREATE EXTERNAL TABLE myData(
attr1 string, attr2 string, attr3 string) 
PARTITIONED BY (group string, team string, dt string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION 's3://myBucket/${DATA_ROOT_DIR}'; 

-- Add paritions without specifying values for dt 
ALTER TABLE myData ADD PARTITION (group='group1',team='team1') ; 
ALTER TABLE myData ADD PARTITION (group='group2',team='team2') ; 

謝謝!

回答

5

Hive不知道這些目錄,除非您告訴它們有關這些目錄,所以無法在不添加分區的情況下訪問分區。

你可以寫一個簡單的腳本來添加所有分區用於給定小組/組:

results = "ALTER TABLE something ADD " 
groups.each do |group| 
    teams.each do |team| 
    partitions = listDirectories("s3n://bucket/", group, team) 
    partitions.each do |partition| 
     results += "PARTITION(group='#{group}', team='#{team}', dt='#{partition}')" 
    end 

    end 
end 

puts results 

貌似你在EMR運行(普通蜂巢甚至沒有修復分區),這是幾乎是RECOVER PARTITIONS所做的事情,但這種方式至少有更多的控制權。

另一種選擇是在添加數據時添加分區,並確保所有分區保持最新狀態。