上一篇中介绍了Flink中的window操作,接着介绍一下窗口函数.
Window Functions
在定义了窗口分配器之后呢,我们需要为每一个窗口明确的指定计算,这个就是窗口函数要做的事情,当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是分组的)。
窗口函数可以是ReduceFunction, FoldFunction , WindowFunction 他们三个中的一个。前面两个更高效一些,因为在每个窗口中增量地对每一个到达的元素执行聚合操作。一个 WindowFunction 可以获取一个窗口中的所有元素的一个迭代以及哪个元素属于哪个窗口的额外元信息。
有WindowFunction的窗口化操作会比其他的操作效率要差一些,因为Flink内部在调用函数之前会将窗口中的所有元素都缓存起来。这个可以通过WindowFunction和ReduceFunction或者FoldFunction结合使用来获取窗口中所有元素的增量聚合和WindowFunction接收的额外的窗口元数据,接下来我们将看一看每一种变体的示例.
ReduceFunction
ReduceFunction指定了如何通过两个输入的参数进行合并输出一个同类型的参数的过程,Flink使用ReduceFunction来对窗口中的元素进行增量聚合。一个ReduceFunction 可以通过如下的方式来定义和使用:
val input: DataStream[(String, Long)] = ...
input
.keyBy(<key selector>)
.window(<window assigner>)
.redu