FlinkSql窗口概念,及水印使用

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] 之间,则两条消息应当发生关联

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值