使用 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
最后,问题是:
我能否配置 AWS Inventory 为多个 S3 存储桶生成清单,以便将所有内容放入同一个 "hive" 目录(即在生成清单时忽略 "source-bucket" 前缀)?
是否可以配置从多个配置单元位置读取的 Athena?但是由于可能会创建和删除新的存储桶,我想这会变得很难看。
除了 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。
我正在尝试使用 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最后,问题是:
我能否配置 AWS Inventory 为多个 S3 存储桶生成清单,以便将所有内容放入同一个 "hive" 目录(即在生成清单时忽略 "source-bucket" 前缀)?
是否可以配置从多个配置单元位置读取的 Athena?但是由于可能会创建和删除新的存储桶,我想这会变得很难看。
除了 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。