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