一篇文章带你彻底明白Flink中Window的2个类型
Window可以分成两类:
CountWindow:按照指定的数据条数生成一个Window,与时间无关。
滚动计数窗口,每隔N条数据,统计前N条数据
滑动计数窗口,每隔N条数据,统计前M条数据
TimeWindow:按照时间生成Window。
滚动时间窗口,每隔N时间,统计前N时间范围内的数据,窗口长度N,滑动距离N
滑动时间窗口,每隔N时间,统计前M时间范围内的数据,窗口长度M,滑动距离N
会话窗口,按照会话划定的窗口

滚动窗口 - TumblingWindow概念
流是连续的,无界的(有明确的开始,无明确的结束)
假设有个红绿灯,提出个问题:计算一下通过这个路口的汽车数量

对于这个问题,肯定是无法回答的,为何?
因为,统计是一种对固定数据进行计算的动作。
因为流的数据是源源不断的,无法满足固定数据的要求(因为不知道何时结束)
那么,我们换个问题:统计1分钟内通过的汽车数量
那么,对于这个问题,我们就可以解答了。因为这个问题确定了数据的边界,从无界的流数据中,取出了一部分有边界的数据子集合进行计算。

那么,这个行为或者说这个统计的数据边界,就称之为窗口。
同时,我们的问题,是以时间来划分被处理的数据边界的,那么按照时间划分边界的就称之为:时间窗口
反之,如果换个问题,统计100辆通过的车里面有多少宝马品牌,那么这个边界的划分就是按照数量的,这样的称之为:计数窗口
同时,这样的窗口被称之为 滚动窗口,按照窗口划分依据分为:滚动时间窗口、滚动计数窗口
滑动窗口 – SlidingWindow概念
同样是需求,改为:
每隔1分钟,统计前面2分钟内通过的车辆数
对于这个需求我们可以看出,窗口长度是2分钟,每隔1分钟统计一次。
或者:每通过100辆车,统计前面通过的50辆车的品牌占比
对于这个需求可以看出,窗口长度是50辆车,但是每隔100辆车统计一次
对于这样的窗口,我们称之为滑动窗口

那么在这里面,统计多少数据是窗口长度(如统计2分钟内的数据,统计50辆车中的数据)
隔多久统计一次称之为滑动距离(如,每隔1分钟,每隔100辆车)
那么可以看出,滑动窗口,就是滑动距离 不等于 窗口长度的一种窗口
比如,每隔1分钟 统计先前5分钟的数据,窗口长度5分钟,滑动距离1分钟,不相等
比如,每隔100条数据,统计先前50条数据,窗口长度50条,滑动距离100条,不相等
那如果相等呢?相等就是比如:每隔1分钟统计前面1分钟的数据,窗口长度1分钟,滑动距离1分钟,相等。
对于这样的需求可以简化成:每隔1分钟统计一次数据,这就是前面说的滚动窗口咯
那么,我们可以看出:
滚动窗口:窗口长度 = 滑动距离
滑动窗口:窗口长度 != 滑动距离
其中可以发现,对于滑动窗口:
滑动距离 > 窗口长度, 会漏掉数据,比如:每隔5分钟,统计前面1分钟的数据(滑动距离5分钟,窗口长度1分钟,漏掉4分钟的数据)
滑动距离 < 窗口长度, 会重复处理数据,比如:每隔1分钟,统计前面5分钟的数据(滑动距离1分钟,窗口长度5分钟,重复处理4分钟的数据)
滑动距离 = 窗口长度, 不漏也不会重复,也就是滚动窗口
