Flink Stream SQL order by

时间:2018-03-09 10:10:41

标签: apache-flink flink-streaming flink-sql

我有一个流媒体输入,比如股票价格数据(包括多个股票),我希望每1分钟按价格排名。排名基于所有股票的最新价格,无论是否在之前的1分钟内更新,都需要对所有股票进行排序。我试图在flink流SQL中使用ORDER BY。

我没有实现我的逻辑,我对两个部分感到困惑:

  1. 为什么ORDER BY只能将时间属性用作主要属性,而只支持ASC?如何通过价格等其他类型实施订单?

  2. 以下SQL(来自Flink文档)是什么意思?没有窗口,也没有窗口所以我假设每次订单都会立即执行SQL,在这种情况下,对一个元素进行排序看起来没什么意义。

  3. [更新]:当我读取ProcimeSortProcessFunction.scala的代码时,似乎Flink对在接下来的一毫秒内收到的元素进行排序。

    SELECT *
    FROM Orders
    ORDER BY orderTime
    

    最后,有没有办法在SQL中实现我的逻辑?

1 个答案:

答案 0 :(得分:1)

流式查询中的

ORDER BY很难计算,因为当我们必须发出需要转到结果表开头的结果时,我们不想更新整个结果。因此,如果我们能够保证结果(大致)增加时间戳,我们只支持ORDER BY time-attribute

将来(Flink 1.6或更高版本),我们还将支持一些查询,例如ORDER BY x ASC LIMIT 10,这将导致更新表包含具有10个最小x值的记录。

无论如何,你不能(轻松)使用GROUP BY翻滚窗口计算每分钟的前k排名。 GROUP BY查询将组的记录(在GROUP BY TUMBLE(rtime, INTERVAL '1' MINUTE)的情况下也是窗口)聚合到单个记录中。因此,每分钟不会有多个记录,只有一个。

如果您想要每分钟在字段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子句而不是ORDER BY窗口的OVER子句。< / p>