使用 Athena 从多个 S3 存储桶中获取清单

Inventory List from multiple S3 buckets using Athena

我正在尝试使用 Athena 查询 AWS S3 Invetory List。如果我只有一个源桶,我可以这样做。我不确定如何配置它以使用多个源存储桶。

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

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

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

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

因此,如果我想查询多个源存储桶的库存数据,似乎我必须为每个 "source-bucket".

创建一个 table

或者,在不使用 Athena 的情况下,我尝试使用 AWS CLI 执行此操作

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

但是这会首先获取每个文件,因为没有选项可以使用 "S3 ls"

设置 --include 或 --exclude

最后,问题是:

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

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

  3. 除了 Athena 或 AWS CLI 或编写自定义代码以使用 manifest.json 文件来获取这些 csv 文件之外,是否有任何替代方法来查询清单列表。

遗憾的是,您不能让 S3 清单为多个存储桶创建一个清单。但是,您可以将库存拼接成一个 table.

您 link 的指南告诉 运行 MSCK REPAIR TABLE … 加载您的库存。我建议你不要这样做,因为它会创建奇怪的 tables,每个分区代表某个时间点的库存,如果你想比较一天中桶中的内容,这可能是你想要的一天或一周又一周,但大多数时候可能不是您想要的。大多数时候你想知道桶里现在有什么。要将多个库存放入同一个 table,您也不应该 运行 该命令。

首先,您稍微更改创建 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。

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

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

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