【问题标题】:merge 2 partitioned folders in a single table将 2 个分区文件夹合并到一个表中
【发布时间】:2020-12-15 06:20:43
【问题描述】:

我正在使用 parquet 文件格式从 2 个 redshift 表中导出数据。

unload ('select * from some_table')
to 's3://132cols/some_table/'
credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxxx'
PARQUET
PARTITION BY (senderid) include;


unload ('select * from another_table')
to 's3://132cols/another_table/'
credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxxx'
PARQUET
PARTITION BY (senderid) include;

数据按 senderid 分区,因此我可以看到 2 个文件夹,例如...

s3://132cols/some_table/senderid=abcd/
s3://132cols/another_table/senderid=abcd/

两个表具有相同的结构,并且两个表中都存在相同的 ID。 有没有办法合并这两个文件夹以查询与 Athena 中的两个表(或 redshift)中的发件人“abcd”相关的数据?

【问题讨论】:

  • 尝试在s3://132cols/ 之上创建一个表并运行查询。我认为它应该工作。但是试一试。
  • 使用ALLOWOVERWRITE,然后将表名作为一个分区(如果需要,还可以添加一个随机分区),如下所示:stackoverflow.com/a/62632562/5287221

标签: amazon-redshift presto amazon-athena


【解决方案1】:

将分区与您的表名一起使用。 可以看另一个例子here

unload ($$ select *, 'some_table' as tbl from some_table $$)
to 's3://132cols/'
credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxxx'
PARQUET
PARTITION BY (senderid,tbl) include
ALLOWOVERWRITE;


unload ($$ select *, 'another_table' as tbl from another_table $$)
to 's3://132cols/'
credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxxx'
PARQUET
PARTITION BY (senderid,tbl) include
ALLOWOVERWRITE;

然后你会得到:

s3://132cols/senderid=abcd/tbl=some_table/
s3://132cols/senderid=abcd/tbl=another_table/

现在您可以在s3://132cols/ 之上创建一个带有 2 个分区的表。

【讨论】:

  • 如果 parquet 导出的数据出现此错误... HIVE_INVALID_METADATA:表 xx 的 Hive 元数据无效:表描述符包含重复列
  • 这是因为我使用了“include”参数和 ALLOWOVERWRITE。这将“tbl”列添加到数据中,从而导致错误。请忽略以上评论。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多