1. Window的概念
无论是无界的数据流还是有界的,Flink都可以做到接收一个数据就立即处理一个数据,最终我们可以得到整个数据流的所有数据的统计结果。
但是,一般来说更多的,我们希望得到的是统计某个区间、或者某个时间段内的数据结果,比如每天的商品销量、每天的网站点击量,这种情况下,我们就需要Flink中的窗口机制Window API来实现。
Window,Flink中的窗口机制,我的简单理解就是:该机制可以将一个数据流中的数据按照一定规则进行切割,分割为一段一段的数据,然后将这些一段一段的数据分发在各自的桶(bucket)中进行分析计算,进而得到一个区间内的统计数据结果。
window机制并不是让Flink变成了批处理,每个桶内的还是每来一条数据就计算一次。
2. Window的类型
2.1 时间窗口(Time Window)
1. 滚动时间窗口(Tumbling Windows)
将数据依据固定的窗口长度对数据进行切分,而且时间对齐,窗口长度固定,窗口之间没有重叠。针对不同的时间语义(即ProcessingTime和EventTime),Flink提供了TumblingProcessingTimeWindows和TumblingEventTimeWindows等常用窗口定义类。

2. 滑动时间窗口(Sliding Windows)
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成,窗口长度固定,可以有重叠。
简单理解就是:当我们定义了第一个窗口的左边界位置的时候,将第一个窗口的左边界向右滑动我们指定的滑动间隔(距离),就是第二个滑动窗口的左边界,同理再向右滑动一次,就是第三个窗口的左边界。
如果创建滑动窗口时,指定的滑动间隔与窗口长度相同,那此时其实就相当于滚动窗口。针对不同的时间语义(即ProcessingTime和EventTime),Flink提供了SlidingProcessingTimeWindows和SlidingEventTimeWindows等常用窗口定义类。

3. 会话窗口(Session Windows)
会话窗口比较特殊,其没有固定的窗口长度,而是是有固定的窗口间隙,或者说timeout,简单来讲就是如果一个窗口在timeout时间之内没有收到数据(这里的时间取决于你使用的是EventTime还是ProcessTime),那么就会关闭当前窗口,开启下一个窗口。针对不同的时间语义(即ProcessingTime和EventTime),Flink提供了ProcessingTimeSessionWindows和EventTimeSessionWindows等常用窗口定义类。
4.
2.2 计数窗口(Count Window)
1. 滚动计数窗口
滚动计数,按照数据个数进行划分,滚动的定义与上面相同。
2. 滑动计数窗口
按照数据个数进行划分,滑动的定义与上面相同。
3. API使用
3.1 数据开窗
flink中对数据流开窗处理有以下几个方法
(1)window():基本的开窗方法,此方法的调用必须在keyBy操作执行之后,时间窗和计数窗口都可以通过此方法开启。
(2)windowAll():此方法的调用不需要keyBy操作,windowAll方法直接开窗,不进行数据分区,相当于对当前整个数据流进行开窗,屏蔽了flink的并行运行,所以该方法而非必要情况下不要使用。
(3)timeWindow():开启时间窗口,是window方法的简写。
(4)countWindow():开启计数窗口,是window方法的简写。
public class WindowApiTes

本文介绍了Flink中的窗口机制,包括时间窗口(滚动与滑动)、计数窗口(滚动与滑动),以及如何使用window()、windowAll()、timeWindow()和countWindow()等API进行数据开窗和计算。重点讲解了窗口函数的分类:增量聚合与全窗口处理,并演示了实例代码。
最低0.47元/天 解锁文章
2927

被折叠的 条评论
为什么被折叠?



