【发布时间】:2022-08-08 11:45:36
【问题描述】:
我有一个 Kinesis 数据传输流配置为使用默认分区配置写入 S3:s3://${bucketname}/${prefix}/${datehour:yyyy/MM/dd/HH}/${filename}。
比如s3://somebucket/backup/2022/06/01/00/example.gz(我目前正在使用gzip进行数据压缩)
为了查询这些数据,我在 Athena 中使用分区投影其中datehour 是分区键。我的数据 (JSON) 类似于:
{
\"someKeyA\" : \"valueA\",
\"someKeyB\" : \"valueB\",
.
.
.
\"yearMonth\" : \"2022/06\"
}
由于 Kinesis 现在支持动态 ID 分区,我想将分区键从 datehour(即 UTC 时间戳)更改为我的数据中存在的 yearMonth 值,即我的新输出 S3 位置看起来像 s3://somebucket/backup/2022/06/example。此外,我还想将记录格式转换为 Parquet 并使用 Snappy 压缩来提高查询性能。
为此,我知道我必须为我的数据创建一个新的 Kinesis 数据传输流和一个新的输出存储桶。发布后,我可以使用yearMonth 作为分区键在 Athena 中创建一个新表。
我还想将旧存储桶中的现有数据转换为新的分区方案和记录格式,以便可以通过新的 Athena 表进行查询。我能想到的一种选择是在 Athena 中使用 CREATE TABLE AS SELECT.. (CTAS) 查询,并按照新格式输出新存储桶中的现有数据。我并不完全精通 Glue,但我相信也可以运行 ETL 作业并执行类似的操作。对现有数据进行这种转换还有哪些其他(可能更好)的选择?
S3 中现有数据的总大小超过 20GB,现有对象的数量接近 100K。我更喜欢一种方法,它需要最少的开发工作,同时保持执行这种转换的成本最小。
标签: amazon-web-services amazon-s3 amazon-athena amazon-kinesis-firehose data-partitioning