我可以在写之前使用 Athena / Presto 对表格进行排序吗?

Posted

技术标签:

【中文标题】我可以在写之前使用 Athena / Presto 对表格进行排序吗?【英文标题】:Can I use Athena / Presto to sort a table before writing? 【发布时间】:2019-08-02 15:12:47 【问题描述】:

我想将我的日志归档为 Parquet 格式。在写表之前,我想按c 列对它进行排序,这样每个 Parquet 文件将只有c 的小范围。当查询在列c 上包含 WHERE 子句(通过谓词下推)时,这将允许 Athena / Presto 有效地扫描表。

但是,我不清楚是否可以使用 Athena 或 Presto 对整个表格进行排序。我需要一个分布式排序——不是发生在单个节点上的排序——因为数据集太大而无法放在单个节点上。这样的一种可能吗?如果是这样,我该如何调用它?

【问题讨论】:

【参考方案1】:

Presto 支持 distributed sort since 0.206。 Athena 是currently based on Presto 0.172,我不知道他们是否反向移植了这个功能。

所以你的选择是

抢最新Presto@https://trino.io/download.html 从 Starburst (https://www.starburstdata.com/presto-aws-cloud/) 轻松在 AWS 上部署 Presto(免责声明:我来自 Starburst) 使用捆绑在 EMR 上的 Presto(我不知道它是如何配置的,但可能默认情况下仍启用分布式排序)

【讨论】:

等等,这真的能解决之前 presto 排序的内存限制吗?从这里 (prestodb.github.io/docs/current/admin/dist-sort.html) 开始,所有数据仍然在单个节点上结束。排序的“分布式”部分只是在所有数据最终在一个节点上之前以分布式方式进行一些预排序。 最终的归并排序是在单个节点上完成的,但它是以流方式完成的(想想:归并排序算法的合并部分)。将此与非分布式排序进行比较,在非分布式排序中,整个数据在排序之前保存在单个节点的内存中(也在内存中)。 感谢您的澄清。如果您将其添加到答案中并基本上说“没有办法在 presto 中以完全分布式(因此可扩展)的方式做到这一点”,那么我会接受您的回答。 在问题中你有“......因为数据集太大而无法容纳在单个节点上” - 使用分布式排序时消除了这个限制,因为分布式排序在内存方面是可扩展的用法。我同意它在处理时间方面不可扩展。 啊,我想我误解了合并排序的流式传输性质如何解决内存问题。如果它绕过内存瓶颈,那么是的,这是我提出的问题的解决方案。我会接受答案。【参考方案2】:

Athena 引擎版本 2(2020 年 11 月 13 日发布)现在似乎支持 Presto 的分布式 ORDER BY 功能:

https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html#:~:text=engine%20version%202.-,Query%20Performance,-Bucketed%20tables%20%E2%80%93%20Improved

ORDER BY – ORDER BY 操作现在默认分布,允许使用更大的 ORDER BY 子句。

【讨论】:

以上是关于我可以在写之前使用 Athena / Presto 对表格进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

Athena/Presto Escape 下划线

athena presto - 从长到宽的多列

Athena/Presto:复杂结构/数组

Athena (Presto) SQL 窗口函数

EMR-Presto 和 Athena 的查询结果差异

用于 In Query 的 Athena/Presto 拆分字符串