AWS Athena (Presto) 偏移支持

Posted

技术标签:

【中文标题】AWS Athena (Presto) 偏移支持【英文标题】:AWS Athena (Presto) OFFSET support 【发布时间】:2018-12-20 06:29:40 【问题描述】:

我想知道 AWS Athena 中是否支持 OFFSET。对于 mysql,以下查询正在运行,但在 athena 中它给了我错误。任何示例都会有所帮助。

select * from employee where empSal >3000 LIMIT 300 OFFSET 20

【问题讨论】:

现在 Athena 支持 OFFSET。请查看docs.aws.amazon.com/athena/latest/ug/… 【参考方案1】:

Athena 基本上是由 Presto 管理的。由于Presto 311,您可以使用OFFSET m LIMIT n 语法或等效的ANSI SQL:OFFSET m ROWS FETCH NEXT n ROWS ONLY

您可以在Beyond LIMIT, Presto meets OFFSET and TIES阅读更多内容。

对于旧版本(包括撰写本文时的 AWS Athena),您可以使用 row_number() 窗口函数来实现 OFFSET + LIMIT。

例如,而不是

SELECT * FROM elb_logs
OFFSET 5 LIMIT 5 -- this doesn't work, obviously

你可以执行

SELECT * FROM (
    SELECT row_number() over() AS rn, * FROM elb_logs)
WHERE rn BETWEEN 5 AND 10;

注意:执行引擎仍然需要从基础表中读取 offset+limit 行,但这仍然比将所有这些行发送回客户端并在那里获取子列表要好得多。

警告:请参阅https://***.com/a/45114359/65458,了解为什么在查询中避免使用 OFFSET 通常是个好主意。

【讨论】:

这个答案对使用 Athena 的人没有帮助,因为在撰写本文时,Athena 没有使用支持 OFFSET 关键字的 presto 版本。 @xno 这就是我同时提供的原因:Athena 的当前 Presto 语法和旧语法。【参考方案2】:

OFFSET 不受 AWS Athena 支持。您可以在此处查看所有支持的 SELECT 参数:SELECT

【讨论】:

感谢您的回复。但是我将如何使用 SELECT 来获取行间的数据。我的要求是根据条件获取前 10K 行,然后取 5001 到 10K 行。 如果你使用或不使用 LIMIT 参数,扫描的数据看起来是一样的,所以我认为你需要缓存所有接收到的行,然后使用缓存的数据只取从 5001 到 10K 的行. 现在支持OFFSET。请查看docs.aws.amazon.com/athena/latest/ug/…【参考方案3】:

当前接受的解决方案似乎不适用于 ORDER BY 关键字,因为在订购之前应用了 row_number()。我相信允许您使用ORDER BY 的确切解决方案如下:

SELECT * FROM (
  SELECT row_number() over() AS rn, *
  FROM ( 
    SELECT *
    FROM elb_logs
    ORDER BY id ASC 
  )
)
WHERE rn BETWEEN 5 AND 10;

【讨论】:

【参考方案4】:

您可以通过数据的自然键来限制和过滤。

例如,如果您的数据集中有一个 id 列,您可以执行以下操作:

SELECT id, * FROM elb_logs
WHERE id > __LAST_SEEN_ID__
ORDER BY id
LIMIT 500 

因此,您的偏移量将根据您处理的最后一个 id 使用过滤器隐式定义。

【讨论】:

以上是关于AWS Athena (Presto) 偏移支持的主要内容,如果未能解决你的问题,请参考以下文章

AWS Athena (Presto) - 如何将时间戳格式化为日期格式?

Presto(AWS Athena)中 datefromparts 的替代方法是啥

AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?

Presto (AWS Athena) 中的拆分和搜索逗号分隔列

AWS DMS:如何处理 Presto/Athena 中的 TIMESTAMP_MICROS parquet 字段

AWS Athena [Presto] 如何仅接收过去 7 天的数据?