ProcessWindowFunction算子单独使用性能较差,如何结合ReduceFunction和AggregateFunction算子结合使用


前言

ProcessWindowFunction算子单独使用性能较差,如何结合ReduceFunction和AggregateFunction算子结合使用?其中心思想是:元素到达窗口后会先进行增量聚合,当窗口关闭时对增量聚合的结果用ProcessWindowFunction再进行全量聚合。


一、什么是WindowFunction?

全量聚合函数
ProcessWindowFunction:统计更复杂的指标可能需要依赖于窗口中所有的数据元素,或需要操作窗口中的状态数据和窗口元数据,能够更加灵活地支持基于窗口全部数据元素的结果计算,例如统计窗口数据元素某一字段的中位数、众数、去重数等等。

增量聚合函数
ReduceFunction:定义了对输入的两个相同类型的数据元素按照指定的计算方法进行聚合的逻辑,然后输出类型相同的结果元素。

AggregateFunction:和ReduceFunction相似,也是基于中间状态计算结果的增量计算函数,但AggregateFunction在窗口计算上更加通用,更加灵活,实现复杂度也相对较高。

FoldFunction:定义了如何将窗口中的输入元素和外部的元素合并的逻辑。目前已在最新版本中移除,这里不展开讲。
 

二、算子结合使用

1.ReduceFunction与ProcessWindowFunction结合使用

代码如下(示例):

// ProcessWindwoFunction与ReduceFunction结合使用
public static void main(String[] args) throws Exception {
    //1.获取流处理环境
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    //1.样例数据
//        DataStreamSource<Tuple2<Integer, Integer>> datastream = env.fromElements(new Tuple2<Integer, Integer>(1, 1), new Tuple2<Integer, Integer>(2, 1), new Tuple2<Integer, Integer>(1, 3), new Tuple2<Integer, Integer>(1, 2), new Tuple2<Integer, Integer>(2, 2));
    DataStreamSource<Tuple3<Integer, Integer, Long>> datastream = env.fromElements(new Tuple3<Integer, Integer, Long>(1, 1, 1000L), new Tuple3<Integer, Integer, Long>(1, 3, 3000L), new Tuple3<Integer, Integer, Long>(1, 2, 2000L), new Tuple3<Integer, Integer, Long>(1, 7, 2000L), new Tuple3<Integer, Integer, Long>(2, 1, 4000L), new Tuple3<Integer, Integer, Long>(1, 3, 3000L), new Tuple3<Integer, Integer, Long>(1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值