窗口
- 时间语义,要配合窗口操作才能发挥作用
- 在Table API 和 SQL 中,主要有两种窗口
Group Window(分组窗口)
- 根据时间或行计数间隔,将行聚合到有限的组(Group)中,并对每个组的数据执行一次聚合函数
Over Windows
- 针对每个输入行,计算相邻范围内的聚合
Group Windows
-
Group Windows是使用window(w:GroupWindows)子句定义的,并且必须由as子句指定一个别名
-
为了按窗口对表进行分组,窗口的别名必须在group by子句中,像常规的分组字段一样引用
Table table = input .window(w:GroupWindow] as "w") //定义窗口,别名为"w" .groupBy("w","a") // 按照字段a和窗口w分组 .select("a,b.sum"); // 聚合
-
Table API 提供了一组具有特定语义的预定义Window类,这些类会被转换为底层DataStream或DataSet的窗口操作
滚动窗口(Tumbling windows)
-
滚动窗口要用Tunble类来定义
//Tumbling Event-time Window .window(Tumble.over("10.minutes").on("rowtime").as("w")) // Tumbling Processing-tiem Window .window(Tumble.over("10.minutes").on("proctime").as("w")) // Tumbling Row-count Window .window(Tumble.over("10.rows").on("proctime").as("w"))
滑动窗口(Sliding windows)
-
滑动窗口要用Slide类来定义
//Sliding Event-time Window .window(Slide.over("10.minutes").every("5.minutes").on("rowtime").as("w")) // Sliding Processing-tiem 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 Window)
-
会话窗口要用Session类来定义
// 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"))
SQL中的Group Windows
-
Group Windows定义在SQL查询的Group By子句中
TUMBLE(time_attr,interval)
- 定义一个滚动窗口,第一个参数是时间字段,第二个参数是窗口字段
HOP(time_attr,interval,interval)
- 定义一个滑动窗口,第一个参数是时间字段,第二个参数是窗口滑动步长,第三是窗口长度
SESSION(time_attr,interval)
- 定义一个会话窗口,第一个参数是时间字段,第二个参数是窗口间隔。
-
案例代码
public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); DataStream<String> fileDataStream