因此,我正在使用Flink DataStream模拟流式任务,并且我想在每个窗口上执行一个SQL查询。
假设这是查询
SELECT name, age, sum(days), avg(salary)
FROM employees
WHERE age > 25
GROUP BY name, age
ORDER BY name, age
我很难将其翻译成翻转。从我的理解来计算平均水平,我需要使用.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。
流中的排序不是微不足道的。您要如何分组永无止境的东西?在您的示例中,您想计算一个平均值或总和,每个窗口只有一个值。您不能排序一个值。
另一种可能性是缓冲所有值,并等待完整性开始分类的指标。得益于活动时间和水印,如果您知道自己已经看到所有值直到一定时间(又称水印(,则可以对流进行分类。
事件时间排序最近引入了,将是Flink 1.4表API的一部分。请参阅此处的示例。