来自雅典娜的多个S3存储桶的清单清单

时间:2019-04-23 19:18:05

标签: amazon-web-services amazon-s3 hive amazon-athena

我正在尝试使用Athena查询AWS S3 Invetory List。如果我只有一个源存储区,则可以执行此操作。我不确定如何配置它以与多个源存储桶一起使用。

我们使用所有默认配置选项,数据格式为CSV。蜂巢的S3库存目标存储桶名称模式如下:

 destination-prefix/source-bucket/config-ID/hive/dt=YYYY-MM-DD-HH-MM/symlink.txt

因此,当我创建Athena表时,必须使用静态配置单元路径。

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (dt string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

因此,如果要查询多个源存储桶的清单数据,似乎必须为每个“源存储桶”创建一个表。

或者,在不使用Athena的情况下,我试图通过AWS CLI做到这一点

aws s3 ls s3://our-bucket-name/prefix/abc --recursive | awk ‘$1 > “2019-04-01”

但这会首先获取每个文件,因为没有选项可以用“ S3 ls”设置--include或--exclude

最后,问题是:

  1. 我是否可以配置AWS Inventory来为多个S3存储桶生成清单,以便将所有内容都放入同一“配置单元”目录(即在生成Invetory时忽略“ source-bucket”前缀)?

  2. 是否可以配置从多个配置单元读取的Athena?但是随着创建和删除新存储桶的可能性,我想这变得很丑。

  3. 是否可以使用其他替代方法来查询清单列表,而不是Athena或AWS CLI或编写自定义代码以使用manifest.json文件来获取这些csv文件。

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法使S3库存为多个存储桶创建一个库存。但是,您可以将库存拼接到一张表中。

您链接到的指南说运行MSCK REPAIR TABLE …来加载库存。我建议您不要这样做,因为它会创建带有分区的怪异表,每个分区都代表某个时间点的清单,如果要每天比较某时段中的存储桶中的内容,则可能需要这样做。一周,但大部分时间可能不是您想要的。大多数时候,您想知道当前存储桶中的内容。要将多个清单放入同一表中,您也不应运行该命令。

首先,您稍微更改创建表的方式:

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (bucket_name string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

请注意,我已将分区从dt string更改为bucket_name string

接下来,您手动添加分区:

ALTER TABLE your_table_name
ADD PARTITION (bucket_name = 'some-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID1/hive/dt=YYYY-MM-DD/'
ADD PARTITION (bucket_name = 'another-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID2/hive/dt=YYYY-MM-DD/';

位置应该是每个存储区的库存“ hive”前缀下最新的S3 URI。

这样做的缺点是,在交付新库存时,您将需要更新表格以指向这些新位置。您可以通过首先删除分区来做到这一点:

ALTER TABLE your_table_name
DROP PARTITION (bucket_name = 'some-bucket')
DROP PARTITION (bucket_name = 'another-bucket');

,然后使用与上述相同的SQL再次添加它们,但使用新的S3 URI。