FlinkSQL窗口概念:
FlinkSQL窗口有三种表现形式,分别为滚动窗口,滑动窗口,会话窗口三种形式,下面具体介绍一下三种窗口使用方法。
滚动窗口:窗口有固定大小,窗口不会叠加
滑动窗口:窗口有固定大小,窗口会叠加
会话窗口:窗口无固定大小,根据数据到来的情况自动划分窗口大小,窗口不会叠加
滚动窗口:
滚动窗口的特点是:有固定大小,窗口中的数据不会重叠,如下图所示。
滚动窗口的语法:
slideSize 控制窗口开窗范围和窗口的滑动大小
>select
> user_id
> ,user_name
> ,count(user_id) as user_cnt
> ,tumble_start(timeCol,slideSize) as start_time
> ,tumber_end(timeCol,sildeSize) as end_time
>table
>group by
> user_id
> ,user_name
> ,tumble(timeCol,slideSize)
滑动窗口:
滑动窗口的特点是:窗口大小固定,滑动间距固定,滑动有重合数据
滑动窗口的语法:
滑动窗口的语法与滚动窗口相比,只多了一个 slide 参数:
第一个slide_size控制窗口的滑动距离,第二个slide_size 控制窗口的开窗范围
select
user_id
,user_name
,hop_start(timeCol,slide_size,slide_size) as start_time
,hop_end(timeCol,slide_size,slide_size) as end_time
,count(user_id) as user_cnt
from
table
group by
user_id
,user_name
,hop(timeCol,silde_size,slide_size)
会话窗口:
会话窗口的特点是:定义一个会话窗口等待时间,假设在指定的时间间隔内没有出现事件则会话窗口关闭。
会话窗口的语法:
slide_size 定义的是前后窗口的等待间隔时间,当事件进来的时间与上一个事件时间间隔小于定义的等待窗口间隔则划分到一个会话里,否则会启动一个新的会话。
select
user_id
,user_name
,session_start(timeCol,slide_size) as start_time
,session_end(timeCol,slide_size) as end_time
,count(user_id) user_cnt
from
table
group by
user_id
,user_name
,session(timeCol,slide_size)
flink提供了几种watermark策略
最严格水印策略:
watermark for rowtime_Col as ts
发出已观察到最大的时间戳,至少更大的最大的行被认为没有迟到。
容忍小于当前时间戳5秒的数据到达
watermark for rowtime_Col as ts intervel ‘5’ second
发出已观察到最大的时间戳减5秒,至少更大的最大的行被认为没有迟到(仅容忍比当前观察到的时间戳小5秒的数据到达,更小的数据将会被丢弃)
双流join的情况下,watermark的获取方式为:
1.分别计算俩条流的watermark
2.然后比对俩条流的watermark选取小的 ->CombineWatermark = min(watermark1,watermark2)
双流join关于的Interval Join的实现
Interval Join则没有window的概念,直接用时间戳作为关联的条件,更具表达力。由于流消息的无限性以及消息乱序的影响,本应关联上的消息可能进入处理系统的时间有较大差异,一条流中的消息,可能需要和另一条流的多条消息关联,因此流流关联时,通常需要类似如下关联条件
1. 等值条件如 a.id = b.id
2. 时间戳范围条件 : a.timestamp ∈ [b.timestamp + lowerBound; b.timestamp + upperBound] b.timestamp + lowerBound <= a.timestamp and a.timestamp <= b.timestamp + upperBound
关联条件的含义
如a.id = b.id and b.timestamp - 1 minutes <= a.timestamp and a.timestamp <= b.timestamp + 2 minutes 即表明两条流中的两条消息如果满足a.id = b.id 并且两条消息的时间戳满足a.timestamp在[b.timestamp-1minute, b.timestamp + 2 minutes] 之间,则两条消息应当发生关联