merge(Acc accumulator, Iterable<Acc> it) :在批式聚合以及流式聚合中的 Session、Hop 窗⼝聚合场景下必须要实现,此外,这个⽅法对于优化也有帮助,例如,打开了两阶段聚合优化,需要 AggregateFunction 实现 merge ⽅法,在数据 shuffle 前先进⾏⼀次聚合计算。 resetAccumulator() :在批式聚合中是必须实现的。
所以可以看到,AggregateFunction的工作原理是:首先调用createAccumulator()为任务初始化一个状态(累加器);而后每来一个数据就调用一次add()方法,对数据进行聚合,得到的结果保存在状态中;等到了窗口需要输出时,再调用getResult()方法得到计算结果。很明显,与ReduceFunction相同,AggregateFunction也是增量式的聚合;而由于输入...
packagecom.lynch.stream.window;importorg.apache.flink.api.common.functions.AggregateFunction;importorg.apache.flink.api.java.tuple.Tuple2;importorg.apache.flink.api.java.tuple.Tuple3;importorg.apache.flink.streaming.api.datastream.DataStream;importorg.apache.flink.streaming.api.environment.StreamExecutionEn...
Flink 的AggregateFunction是一个基于中间计算结果状态进行增量计算的函数。由于是迭代计算方式,所以,在窗口处理过程中,不用缓存整个窗口的数据,所以效率执行比较高。 二,AggregateFunction接口类 输入类型(IN),累加器类型(ACC)和输出类型(OUT)。 @PublicEvolving public interface AggregateFunction<IN, ACC, OUT> extend...
本文主要研究一下flink Table的AggregateFunction 实例 /** * Accumulator for WeightedAvg. */ public static class WeightedAvgAccum { public long sum = 0; public int count = 0; } /** * Weighted Average user-defined aggregate function. */ public static class WeightedAvg extends AggregateFunction<...
import org.apache.flink.table.functions.AggregateFunction import org.apache.flink.types.Row /** * @program: demo * @description: 聚合函数:多行数据聚合输出一行数据 * @author: yang * @create: 2021-01-16 16:41 */ object aggFunc {
util.Pair[T, R] type JavaList[T] = java.util.List[T] //... /** * Create functions to compute a [[org.apache.flink.table.plan.nodes.dataset.DataSetAggregate]]. * If all aggregation functions support pre-aggregation, a pre-aggregation function and the * respective output...
Window Function 有四种: ReduceFunction AggregateFunction FoldFunction ProcessWindowFunction 前面两个会执行的更加有效率,因为在元素到来时,Flink 可以增量的把元素聚合到每个窗口上。 ProcessWindowFunction 提供了一个 Iterable 迭代器,可以获得一个窗口的所有元素以及元素的元数据信息。
在Flink的WindowOperator.java源代码中,只有在当前窗口属于MergingWindowAssigner抽象类的实例时,才会调用Window Function的merge方法。进一步分析后发现,只有SessionWindow继承了该类。通过在Debug模式下进行实验,我们可以验证只有SessionWindow才会调用AggregateFunction的merge方法。有兴趣的读者可以参考我的Flink...
比如ReduceFunction、AggregateFunction或者ProcessWindowFunction,需要注意的是FoldFunction不能merge!