Flink Stream SQL 排序依据
Flink Stream SQL order by
我有一个流输入,比如股票价格数据(包括多只股票),我想每 1 分钟按它们的价格进行一次排名。排序是基于所有股票的最新价格,无论是否在前一分钟内更新,都需要对所有股票进行排序。我尝试在 flink 流 SQL.
中使用 ORDER BY
我未能实现我的逻辑,我对两部分感到困惑:
为什么ORDER BY
只能使用一个时间属性为主,只支持ASC
?如何通过价格等其他类型执行订单?
下面的SQL(来自Flink文档)是什么意思?没有 window 也没有 window 所以我假设 SQL 将在每个订单进来时立即执行,在这种情况下,对一个元素进行排序看起来毫无意义。
[更新]:我看ProcimeSortProcessFunction.scala的代码时,好像是Flink对下一毫秒接收到的元素进行排序
SELECT *
FROM Orders
ORDER BY orderTime
最后,有没有办法在SQL中实现我的逻辑?
ORDER BY
在流式查询中很难计算,因为当我们必须发出一个需要转到结果开头的结果时,我们不想更新整个结果 table.因此,如果我们可以保证结果具有(大致)增加的时间戳,我们只支持 ORDER BY time-attribute
。
未来(Flink 1.6 或更高版本),我们还将支持一些查询,例如 ORDER BY x ASC LIMIT 10
,这将导致更新 table,其中包含 10 个最小的记录 [=14] =] 值。
无论如何,您无法(轻松地)使用 GROUP BY
翻滚 window 来计算每分钟的 top-k 排名。 GROUP BY
查询将组的记录(在 GROUP BY TUMBLE(rtime, INTERVAL '1' MINUTE)
的情况下也是 window)聚合到单个记录中。所以每分钟不会有多个记录,只有一个。
如果您希望查询每分钟计算字段 a
的前 10 名,您需要一个与此类似的查询:
SELECT a, b, c
FROM (
SELECT
a, b, c,
RANK() OVER (ORDER BY a PARTITION BY CEIL(t TO MINUTE) BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as rank
FROM yourTable)
WHERE rank <= 10
但是,Flink(1.4 版)尚不支持此类查询,因为时间属性用于 PARTITION BY
子句而不是 OVER
的 ORDER BY
子句 window.
我有一个流输入,比如股票价格数据(包括多只股票),我想每 1 分钟按它们的价格进行一次排名。排序是基于所有股票的最新价格,无论是否在前一分钟内更新,都需要对所有股票进行排序。我尝试在 flink 流 SQL.
中使用 ORDER BY我未能实现我的逻辑,我对两部分感到困惑:
为什么
ORDER BY
只能使用一个时间属性为主,只支持ASC
?如何通过价格等其他类型执行订单?下面的SQL(来自Flink文档)是什么意思?没有 window 也没有 window 所以我假设 SQL 将在每个订单进来时立即执行,在这种情况下,对一个元素进行排序看起来毫无意义。
[更新]:我看ProcimeSortProcessFunction.scala的代码时,好像是Flink对下一毫秒接收到的元素进行排序
SELECT *
FROM Orders
ORDER BY orderTime
最后,有没有办法在SQL中实现我的逻辑?
ORDER BY
在流式查询中很难计算,因为当我们必须发出一个需要转到结果开头的结果时,我们不想更新整个结果 table.因此,如果我们可以保证结果具有(大致)增加的时间戳,我们只支持 ORDER BY time-attribute
。
未来(Flink 1.6 或更高版本),我们还将支持一些查询,例如 ORDER BY x ASC LIMIT 10
,这将导致更新 table,其中包含 10 个最小的记录 [=14] =] 值。
无论如何,您无法(轻松地)使用 GROUP BY
翻滚 window 来计算每分钟的 top-k 排名。 GROUP BY
查询将组的记录(在 GROUP BY TUMBLE(rtime, INTERVAL '1' MINUTE)
的情况下也是 window)聚合到单个记录中。所以每分钟不会有多个记录,只有一个。
如果您希望查询每分钟计算字段 a
的前 10 名,您需要一个与此类似的查询:
SELECT a, b, c
FROM (
SELECT
a, b, c,
RANK() OVER (ORDER BY a PARTITION BY CEIL(t TO MINUTE) BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as rank
FROM yourTable)
WHERE rank <= 10
但是,Flink(1.4 版)尚不支持此类查询,因为时间属性用于 PARTITION BY
子句而不是 OVER
的 ORDER BY
子句 window.