我有一个很大的 mysql 表,其中包含大量主题的每日指标。这是假设模式:
day DATE
subject_id INT
metric1
metric2
metric3
我想要的是在任意日期范围内找到前 X 个主题(按特定指标)。是这样的:
SELECT subject_id, SUM(metric1)
FROM t1
WHERE day BETWEEN '2018-05-01' AND '2018-05-15'
GROUP BY subject_id
ORDER BY SUM(metric1) DESC
LIMIT 10
鉴于该表包含 1000 万个主题,以及过去 365 天的每日指标,它大约包含 3.6B 行。无论我如何对其进行索引/分区,仍然会有一些情况会使查询运行很长时间(例如,用户选择过去 365 天的时间段)。目标是在几秒钟内完成查询,以便它们可用于实时为仪表板提供动力。
我曾尝试使用 Amazon Aurora (MySql) 来实现这一点,但还没有设法优化它以使其运行速度几乎达到所需的速度。
似乎最好的选择是 BigQuery 和 Athena。不过,我想知道是否有专门针对这个特定用例量身定制的替代方案?
值是否更新,如果是,多久更新一次?
这是个好问题。我们有很多数据集,其中绝大多数数据是仅附加数据。然而,很少有较大的数据集会在前 60 天内更新 2-3 次。实际上只有 5% 的数据被修改,而 95% 的数据与插入当天保持不变。
Amazon Athena 将是此应用程序的不错选择。但是,查询可能不会在几秒钟内完成。因此,解决方案可能是使用 Athena 生成聚合,然后将结果加载到关系数据库中以支持您的仪表板,AWS Glue 可以帮助处理此数据管道。
要在 Athena 中生成聚合:
您将创建一个 S3 存储桶:
s3://somebucket/
然后您将创建格式化为您的分区的标签:
s3://somebucket/date_partition=YYYY-MM-DD/
有了这个要求,我可能会在 Athena 中预先计算与数据科学家和业务用户相关的范围(最后一年、最后一个月、最后一年等)的聚合,然后将它们写入关系数据库。在 AWS 上,Glue对于这种数据流水线很有用)。如果历史数据不经常更新(或根本不更新),这个过程可以作为每日批处理运行(如@Michael Kutz 建议的那样)。
看:
AWS 文档 » Amazon Athena » 用户指南 » 使用源数据 » 分区数据
11 亿次在 Amazon Athena 上乘坐出租车