Apache flink flinkstreamsql顺序

Apache flink flinkstreamsql顺序,apache-flink,flink-streaming,flink-sql,Apache Flink,Flink Streaming,Flink Sql,我有一个流式输入,比如说包含多只股票的股票价格数据,我想每1分钟对它们的价格进行一次排名。排名基于所有股票的最新价格,需要对所有股票进行排序,无论是否在前1分钟更新。我尝试在flinkstreamsql中使用orderby 我未能实现我的逻辑,我对两个部分感到困惑: 为什么ORDER BY只能使用时间属性作为主要属性,并且只支持ASC?如何通过其他类型(如价格)实现订单 下面来自Flink文档的SQL是什么意思?没有窗口,也没有窗口,所以我假设SQL将在每个订单进入时立即执行,在这种情况下,对一

我有一个流式输入,比如说包含多只股票的股票价格数据,我想每1分钟对它们的价格进行一次排名。排名基于所有股票的最新价格,需要对所有股票进行排序,无论是否在前1分钟更新。我尝试在flinkstreamsql中使用orderby

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

为什么ORDER BY只能使用时间属性作为主要属性,并且只支持ASC?如何通过其他类型(如价格)实现订单

下面来自Flink文档的SQL是什么意思?没有窗口,也没有窗口,所以我假设SQL将在每个订单进入时立即执行,在这种情况下,对一个元素进行排序看起来毫无意义

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

最后,有没有一种方法可以在SQL中实现我的逻辑?

流式查询中的ORDER BY很难计算,因为当我们必须发出一个需要转到结果表开头的结果时,我们不想更新整个结果。因此,如果我们能够保证结果具有大致增加的时间戳,那么我们只支持orderbytime属性

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

无论如何,您无法使用分组滚动窗口轻松计算每分钟的top-k排名。GROUP BY查询将GROUP ALLOW窗口的记录聚合到单个记录中。如果是GROUP BY TRULPRTIME,则间隔“1”分钟。所以每分钟不会有多条记录,只有一条

如果您希望查询以每分钟计算字段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版还不支持此类查询,因为时间属性在OVER窗口的PARTITION by子句中使用,而不是ORDER by子句中使用。

谢谢Fabian,我错了,我认为ORDER by是为窗口内的元素而不是窗口结果计算的,谢谢澄清它。
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