我正在尝试使用 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
最后,问题是:
我可以配置 AWS Inventory 为多个 S3 存储桶生成清单,以便将所有内容放入同一个“hive”目录中(即在生成清单时忽略“source-bucket”前缀)吗?
是否可以配置 Athena 从多个配置单元位置读取?但由于有可能创建和删除新的存储桶,我想这会变得很难看。
是否有其他方法可以代替 Athena 或 AWS CLI 来查询库存列表,或者编写自定义代码来使用 manifest.json 文件来获取这些 csv 文件。
遗憾的是,您无法让 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。