2017-06-28 33 views
0

所以我模拟使用Flink DataStream的流任务,我想在每个窗口上执行SQL查询。Flink DataStream - 在窗口上执行SQL查询,做orderBy

比方说,这是查询

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

我有一个很难将其翻译为弗林克。根据我的理解,为了计算平均值,我需要手动使用.apply()WindowFunction。但是,我如何计算总和呢?也手动在相同的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?? 

我检查了Table API但似乎对于流不是很多操作的支持,e.g排序依据。

回答

0

排序流式传输并不重要。你如何挑选永不结束的东西?在你的例子中,你想计算一个平均值或一个和,这只是每个窗口的一个值。你无法对一个值进行排序。

另一种可能性是缓冲所有值并等待完整性指示符开始排序。多亏了事件时间和水印,如果您知道您已经看到所有值直到某个时间(又名水印),则可以对流进行排序。

最近引入了事件时排序,它将成为Flink 1.4 Table API的一部分。一个例子见here