在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情,
当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是
分组的)。
谁可以作为窗口函数来使用:
function | 优点 | 缺点 |
ReduceFunction | 更高效,因为在每个窗口中增量地对 每一个到达的元素执行聚合操作(增量 聚合) |
场景覆盖不全,无法获取窗口的元 数据 |
AggregateFunction(max/maxBy…) | ||
FoldFunction(不推荐) | ||
WindowFunction/AllWindowFuncti on(遗留) |
场景覆盖全面,可以拿到窗口的元数 据; |
• 相对低效一些,先把属于窗口的 所有元素都缓存,等到该计算了, 全部拿出来再计算; • 都可跟reducefun、 aggfun、 foldfun组合使用 |
ProcessWindowFunction/Process AllWindowFunction |
||
ProcessWindowFunction与前三者 之一组合(混搭) |
兼具高效和场景的覆 |
特别提示:在没有专门说明的情况下,凡是带All的API就是给Non-keyed window使用的
ReduceFunction 含义: ReduceFunction定义了如何把两个输入的元素进行合并来生成相同类型的输出元素的过程,Flink使用ReduceFunction来对窗口中的元素进行增量聚合AggregateFunction
AggregateFunction是ReduceFunction的普适版本,它需要指定三个类型:输入类型(IN)、 累加器类型(ACC)和输出类型(OUT)。
输入类型是输入流中的元素类型,AggregateFunction有一个方法可以将一个输入元素添加到一个累加器中。该接口还具有创建初始累加器、将两个累加器合并到一个累加器以及从累加器中提取输出(类型为OUT)的方法。 (相当于ReduceFunction自定义函数版本)
FoldFunction 含义: FoldFunction指定了一个输入元素如何与一个指定输出类型的元素合并的过程,这个FoldFunction 会被每一个加入到窗口中的元素和当前的输出值增量地调用,第一个元素是与一个预定义的类型为输出类型的初始值合并
WindowFunction/AllWindowFunction(会逐步退出历史舞台)
ProcessWindowFunction/ProcessAllWindowFunction 含义: ProcessWindowFunction获得一个包含窗口所有元素的可迭代器, 以及一个具有时间和状
态信息访问权的上下文对象,这使得它比其他窗口函数提供更大的灵活性。这是以性能和资源消耗为代价的,因为元素不能增量地聚合,而是需要在内部缓冲,直到认为窗口可以处理为止。
•indowFunctionde的升级版,可以跟ReduceFunction /AggregateFunction/FoldFunction结合使用(推荐用法)
在ProcessWindowFunction中使用每个窗口的状态 含义: ProcessWindowFunction可以与ReduceFunction、 AggregateFunction或FoldFunction组
合,以便在元素到达窗口时增量地聚合它们。当窗口关闭时, ProcessWindowFunction将提供聚
合结果。 ProcessWindowFunction可以在访问附加窗口元信息的同时进行增量计算。