窗口(Windows)
- 时间语义,要配合窗口操作才能发挥作用。最主要的用途,当然就是开窗口、根据时间段做计算了。下面我们就来看看Table API和SQL中,怎么利用时间字段做窗口操作。
- 在Table API和SQL中,主要有两种窗口:Group Windows和Over Windows
分组窗口(Group Windows)
- Group Windows 是使用 window(w:GroupWindow)子句定义的,并且必须由as子句指定一个别名。
- 为了按窗口对表进行分组,窗口的别名必须在 group by 子句中,像常规的分组字段一样引用
- Table API 提供了一组具有特定语义的预定义 Window 类,这些类会被转换为底层 DataStream 或 DataSet 的窗口操作
- 分组窗口分为三种:滚动窗口、滑动窗口、会话窗口
滚动窗口(Tumbling windows):
- 滚动窗口(Tumbling windows)要用Tumble类来定义
- over:定义窗口长度
- on:用来分组(按时间间隔)或者排序(按行数)的时间字段
- as:别名,必须出现在后面的groupBy中
// Tumbling Event-time Window(事件时间字段rowtime)
.window(Tumble over 10.minutes on 'rowtime as 'w)
// Tumbling Processing-time Window(处理时间字段proctime)
.window(Tumble over 10.minutes on 'proctime as 'w)
// Tumbling Row-count Window (类似于计数窗口,按处理时间排序,10行一组)
.window(Tumble over 10.rows on 'proctime as 'w)
滑动窗口(Sliding windows):
- 滑动窗口(Sliding windows)要用Slide类来定义
- over:定义窗口长度
- every:定义滑动步长
- on:用来分组(按时间间隔)或者排序(按行数)的时间字段
- as:别名,必须出现在后面的groupBy中
// Sliding Event-time Window
.window(Slide over 10.minutes every 5.minutes on 'rowtime as 'w)
// Sliding Processing-time window
.window(Slide over 10.minutes every 5.minutes on 'proctime as 'w)
// Sliding Row-count window
.window(Slide over 10.rows every 5.rows on 'proctime as 'w)
会话窗口(Session windows):
- 会话窗口(Session windows)要用Session类来定义
- withGap:会话时间间隔
- on:用来分组(按时间间隔)或者排序(按行数)的时间字段
- as:别名,必须出现在后面的groupBy中
// Session Event-time Window
.window(Session withGap 10.minutes on 'rowtime as 'w)
// Session Processing-time Window
.window(Session withGap 10.minutes on 'proctime as 'w)
Over Windows
- Over window 聚合是标准 SQL 中已有的(over 子句),可以在查询的 SELECT 子句中定义
- Over window 聚合,会针对每个输入行,计算相邻行范围内的聚合
- Over windows 使用 window(w:overwindows*)子句定义,并在 select()方法中通过别名来引