针对stream数据中的时间,可以分为一下两种:
1、Event Time:事件的产生时间,通常由事件中的时间戳描述。
2、Processing Time:事件被处理时的系统时间。
消息乱序:
在实时系统中,由于各种原因的延时,导致事件到Flink的时间晚于事件产生的时间。如果我们基于Event Time来构建Window,对于延时的事件,我们不可能一直等待下去,所以就需要有一个机制来保证特定的时间后,必须触发执行Window(这个机制也就是Watermark机制)。
FlinkSQL创建表单时获取/设置两种时间的方式:
1、Processing Time:添加字段别名为 PROCTIME()即可,例如:proctime AS PROCTIME()
2、Event Time:

如图,用来设置水位线的时间需要是TIMESTAMP的格式。
FlinkSQL时间窗口:
一、Group Windows:分组窗口,将事件按照时间或计数的方式分为若干组,然后对每个组执行窗口函数
1、是否键控分类
(1)键控Window:先根据指定的字段进行分组,再依据时间或计数构建的Window
(2)非键控Window:不根据字段,直接基于时间或计数构建的Window
2、窗口分类:
(1)时间窗口:
* 翻滚时间窗口
– 依据固定窗口长度对无界数据流进行切片。
– 使用:TUMBLE(ts,INTERVAL ‘1’ HOUR),其中TUMBLE_START获取窗口开始时间,TUMBLE_END获取窗口结束时间
* 滑动时间窗口
– 固定的窗口长度和滑动间隔组成,event之间存在重叠的情况。(每5S取最新1H的数据)
– 使用:HOP()
* 会话窗口
– 一段时间没有收到新的数据,就会产生一个窗口,没有固定的开始和结束时间。
– 使用:SESSION()
(2)计数窗口:
翻滚计数窗口
滑动计数窗口
二、Windowing TVFs:窗口表值函数
窗口表值函数可以完全替代传统的分组窗口函数,窗口TVF更符合SQL标准,性能得到了优化,拥有更强大的功能。可以支持基于窗口的复杂计算,例如窗口Top-N、窗口联结(window join)等。
目前Flink支持类型:
1、滚动窗口(Tumbling Windows)
(1)定义:长度固定,时间对齐,无event重叠,适用于周期性的统计计算。
2、滑动窗口(Hop Windows,跳跃窗口)
3、累积窗口(Cumulate Windows)
4、会话窗口(Session Windows)