在窗口上执行sql查询,执行orderby

ep6jt1vc  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(384)

所以我用flinkdatastream模拟一个流任务,我想在每个窗口上执行一个sql查询。
假设这是一个查询

SELECT name, age, sum(days), avg(salary)
FROM employees
WHERE age > 25
GROUP BY name, age
ORDER BY name, age

我很难把它翻译成Flink。根据我的理解,要计算平均值,我需要手动使用 .apply() 以及 WindowFunction . 那我怎么计算总数呢?在同一个窗口函数中是否也手动?
我还想知道是否有可能对整个窗口进行订购?
下面是我到目前为止所想到的伪代码。任何帮助都将不胜感激!谢谢!

employeesStream
.filter(new FilterFunction() ....)    \\ where clause
.keyby(nameIndex, ageIndex)           \\ group by??
.timeWindow(Time.seconds(10), Time.seconds(1))
.apply(new WindowFunction() ....)     \\ calculate average (and sum?)
// order by??

我检查了表api,但似乎流不支持很多操作,例如orderby。

svmlkihl

svmlkihl1#

流媒体中的排序并不简单。你想怎样去分类那些永无止境的东西?在您的示例中,您希望计算一个平均值或总和,即每个窗口只有一个值。不能对一个值进行排序。
另一种可能是缓冲所有值,等待完整性指标开始排序。多亏了事件时间和水印,如果您知道在某个特定时间之前看到了所有值(又称水印),就可以对流进行排序。
最近引入了事件时间排序,它将成为Flink1.4表api的一部分。请参见此处以获取示例。

相关问题