2012-06-12 93 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所做的事情,但这种方式至少有更多的控制权。

另一种选择是在添加数据时添加分区,并确保所有分区保持最新状态。