AWS Athena (Presto) OFFSET 支持

AWS Athena (Presto) OFFSET support

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

select * 来自 empSal >3000 LIMIT 300 OFFSET 20 的员工

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

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() window 函数来实现 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 行 table,但这仍然比将所有这些行发送回客户端并在那里获取子列表要好得多。

警告:请参阅 了解为什么在查询中避免 OFFSET 通常是个好主意的解释。

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

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

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

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

目前接受的解决方案似乎无法与 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;