问题描述
我想要一个表来存储一个对象一周的历史记录,然后用下周的历史记录替换它。在 aws 中实现这一目标的最佳方法是什么?
数据以json格式存储在s3中是每周转储。管道每周运行一次脚本并将数据转储到 s3 中进行分析。对于脚本的下一次运行,我不需要之前的第 1 周数据,因此需要将其替换为新的第 2 周数据。表的模式保持不变,但数据每周都在变化。
解决方法
我建议使用数据分区来解决您的问题,而无需删除前几周的底层 S3 文件(这是不可能通过 Athena 查询实现的)。
因此,想法是使用基于日期的分区键,然后在您的 Athena 请求的 WHERE 子句中使用此分区键,这将导致 Athena 忽略之前的文件(不在最后一个分区下) .
例如,如果您使用文件转储日期作为分区键(假设我们选择将其命名为 dump_key),您的文件将必须存储在子文件夹中,例如
s3://your-bucket/subfolder/dump_key=2021-01-01-13-00/files.csv
s3://your-bucket/subfolder/dump_key=2021-01-07-13-00/files.csv
然后,在数据处理期间,您首先需要创建表并使用 PARTITIONED BY 选项指定分区键。
然后,您必须确保每次在您的用例需要时都使用 PARTITION ADD 命令添加一个新分区:
ALTER TABLE your_table ADD PARTITION (dump_key='2021-01-07-13-00') location 's3://your-bucket/subfolder/dump_key=2021-01-07-13-00/'
然后您就可以通过使用正确的 WHERE 子句过滤以前的数据来查询您的表:
SELECT * FROM my_table WHERE dump_key >= 2021-01-05-00-00
这将导致 Athena 在查询您的表时忽略先前分区中的文件。
此处的文档: