繁体   English   中英

Hive Table添加分区以加载所有子目录

[英]Hive Table add partition to load all subdirectories

我正在使用配置单元(带外部表)来处理存储在amazon S3上的数据。

我的数据分区如下: group/team/dt/ (例如,数据文件可能存储在路径group=myGroup/team=myTeam/dt=20120603

我想处理几个团队(不同组)的数据。 由于RCOVER PARTITIONS需要很长时间,因此我想基于组和团队值将多个分区添加到hive表中(即,给定该团队中所有可用日期的组和团队负载数据)。

我正在寻找的功能是:

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') ;

谢谢!

在你告诉它们之前,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所做的,但这样你至少可以获得更多的控制权。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM