FLINK-窗口函数-ReduceFunction/AggregateFunction/ProcessWindowFunction
1.ReduceFunction
增量聚合,输入输出元素类型相同。
2.AggregateFunction
增量聚合,输入输出元素类型可以不相同。
3.ProcessWindowFunction
一些业务场景,我们需要收集窗口内所有的数据进行计算,例如计算窗口数据的中位数,或者计算窗口数据中出现频率最高的值。这样的需求,使用ReduceFunction和AggregateFunction就无法实现了。这个时候就需要ProcessWindowFunction了。
process()方法接受的参数为:
window的key,
Iterable迭代器包含窗口的所有元素,
Collector用于输出结果流。
Context参数和别的process方法一样。而ProcessWindowFunction的Context对象还可以访问window的元数据(窗口开始和结束时间),当前处理时间和水位线,per-window state和per-key global state,side outputs。
- per-window state: 用于保存一些信息,这些信息可以被process()访问,只要process所处理的元素属于这个窗口。
- per-key global state: 同一个key,也就是在一条KeyedStream上,不同的window可以访问per-key global state保存的值。
4.结合使用
ReduceFunction/AggregateFunction和ProcessWindowFunction结合使用,分配到某个窗口的元素将被提前聚合,而当窗口的trigger触发时,也就是窗口收集完数据关闭时,将会把聚合结果发送到ProcessWindowFunction中,这时Iterable参数将会只有一个值,就是前面聚合的值。
input
.keyBy(...)
.timeWindow(...)
.reduce(
incrAggregator: ReduceFunction[IN],
function: ProcessWindowFunction[IN, OUT, K, W])
input
.keyBy(...)
.timeWindow(...)
.aggregate(
incrAggregator: AggregateFunction[IN, ACC, V],
windowFunction: ProcessWindowFunction[V, OUT, K, W])
结合使用:
- 可将
ProcessWindowFunction与增量聚合函数ReduceFunction、AggregateFunction结合。 - 元素到达窗口时增量聚合,当窗口关闭时对增量聚合的结果用
ProcessWindowFunction再进行全量聚合。 - 既可以增量聚合,也可以访问窗口的元数据信息(如开始结束时间、状态等)。

浙公网安备 33010602011771号