4

我正在使用 hive(带有外部表)来处理存储在 amazon S3 上的数据。

我的数据分区如下:( 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') ;

谢谢!

4

2 回答 2

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),这几乎就是 RECOVER PARTITIONS 所做的,但这样您至少可以拥有更多控制权。

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

于 2012-06-13T15:03:22.267 回答
0

请检查动态分区插入 - https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-DynamicpartitionInsert

在这种方法中,列本身成为分区。这有效地避免了在插入语句中对分区名称进行硬编码。

于 2012-08-31T07:22:59.633 回答