flink一次对整个窗口进行聚合操作-ProcessWindowFunction

640?wx_fmt=png


前面说了很多关于flinkwindows相关原理的内容,今天讲一个flinkwindow相关操作的一个实战内容吧。

首先,回顾一下Spark Streamingwindows操作,实际上就是在将微批增加若干倍(窗口大小处以批处理大小),这样就形成了窗口,那对于与kafka的结合这种方式,原理我在星球的源码里也说过了,实际上并没有真实的去kafka取数据,而是计算了offset,这种情况下,实际上窗口计算的时候并没有一批次缓存全部数据,当然基于receiver那种就不行了因为是blockrddreceiver直接接受了数据。

而对于flink kafka的区别也说过,flink是数据在拓扑图里流动,那么窗口操作也是增量的计算。实际上有时候我们可能想要针对一整个窗口计算,然后灵活的控制时间及窗口状态,flink神奇就神奇在可以很容易实现我们的操作。 

神奇的ProcessWindowFunction

ProcessWindowFunction一次性迭代整个窗口里的所有元素,比较重要的一个对象是Context,可以获取到事件和状态信息,这样我们就可以实现更加灵活的控制,这实际上是process的主要特点吧。该算子会浪费很多性能吧,主要原因是不增量计算,要缓存整个窗口然后再去处理,所以要设计好内存。

牛叉的地方是ProcessWindowFunction可以结合 ReduceFunction,  AggregateFunction, 或者 FoldFunction来做增量计算。

本文就举一个简单的例子,主要是实现针对窗口的分组统计功能。

package org.datastream.windows;

import org.apache.flink.api.common.functions.FoldFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple2;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值