如何让我的 Athena SQL 查询更快

How can I make my Athena SQL query faster

我是 运行 这个基于 PrestoDB 的 AWS Athena。我最初的计划是查询过去 3 个月的数据来分析该数据。但是,即使过去2小时的查询时间也需要30多分钟,此时Query超时。有没有更高效的查询方式?

SELECT column1, dt, column 2
FROM database1
WHERE date_parse(dt, '%Y%m%d%H%i%s') > CAST(now() - interval '1' hour AS timestamp)

日期列以字符串形式记录YYYYmmddhhmmss

问题很可能是查询在被过滤的列上应用了一个函数。这是低效的,因为数据库需要先转换整个列才能对其进行过滤。一个说这个谓词是non-SARGable.

您的主要工作应该是修复数据模型并将日期存储为 date 而不是字符串。

也就是说,您用来表示日期的字符串格式仍然可以使用直接过滤。思路是将过滤值转换为目标字符串格式(而不是将列值转换为日期):

where dt > date_format(now() - interval '1' hour, '%Y%m%d%H%i%s')

有很多不同的因素会影响 Athena 执行查询所需的时间。数据量通常是主要因素,但其他重要因素是数据格式(例如,CSV 和 Parquet 之间存在巨大差异)和文件数量。与许多其他新数据库情况相比,查询的复杂性通常不是一个重要因素,并且您的查询非常简单并且不是问题(在 [=10 的两边应用函数没有帮助=] 条件,但这在 Athena 中没什么大不了的,因为过滤是蛮力的,并且与像 Athena 这样的引擎中的 IO 相比,在每一行上应用一个函数并不是什么大不了的事。

如果您提供有关文件数量、数据格式等的更多信息,我们可能会更好地帮助您,因为如果没有此类信息,它可能只是任何东西。我怀疑你有类似单个前缀的东西,有数千万或数亿个文件——这对 Athena 来说是最糟糕的情况。

当 Athena 计划查询时,它会列出 table 在 S3 上的位置。 S3 的列表操作的页面大小为 1000,因此如果文件多于此,Athena 将必须按顺序列出,直到获得完整列表。这不能并行化,而且速度也不是很快。

您需要几乎不惜一切代价避免同一前缀中的文件超过 1000 个。如果文件多于该数量,则可以添加前缀(目录),因为 Athena 会将 S3 列为文件系统,并并行列出前缀。 table-data/a/table-data/b/table-data/c/ 中每个 1000 个文件比 table-data/.

中的 3000 个文件要好得多

我怀疑它是大量小文件而不是大量数据的原因是,如果它是大量数据,您可能会这么说——大量数据实际上是 Athena 真正擅长的。翻录数 TB 的数据没有问题,除非它是十亿个小文件。