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