使用 Athena 的多个 S3 存储桶的库存列表

问题描述 投票:0回答:1

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

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

 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 存储桶生成清单,以便将所有内容放入同一个“hive”目录中(即在生成清单时忽略“source-bucket”前缀)吗?

  2. 是否可以配置 Athena 从多个配置单元位置读取?但由于有可能创建和删除新的存储桶,我想这会变得很难看。

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

amazon-web-services amazon-s3 hive amazon-athena
1个回答
7
投票

遗憾的是,您无法让 S3 Inventory 为多个存储桶创建一个库存。不过,您可以将库存拼接到一张表中。

您链接到的指南显示运行

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/'
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')
PARTITION (bucket_name = 'another-bucket');

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

© www.soinside.com 2019 - 2024. All rights reserved.