Flink 窗口函数
Flink常用的3种窗口函数:
滚动窗口:窗口数据有固定的大小,窗口中的数据不会叠加;
滑动窗口:窗口数据有固定大小,并且有生成间隔;
会话窗口:窗口数据没有固定的大小,根据用户传入的参数进行划分,窗口数据无叠加;
一、 滚动窗口
特点:有固定大小、窗口中的数据不会重叠
1 SELECT 2 3 [gk], 4 5 [TUMBLE_START(timeCol, size)], 6 7 [TUMBLE_END(timeCol, size)], 8 9 agg1(col1), 10 11 ... 12 13 aggn(colN) 14 15 FROM Tab1 16 17 GROUP BY [gk], TUMBLE(timeCol, size)
如计算每个用户每天的订单数量:
SELECT user, TUMBLE_START(timeLine, INTERVAL '1' DAY) as winStart, SUM(amount) FROM Orders GROUP BY TUMBLE(timeLine, INTERVAL '1' DAY), user;
其中,TUMBLE_START 和 TUMBLE_END 代表窗口的开始时间和窗口的结束时间,TUMBLE (timeLine, INTERVAL '1' DAY) 中的 timeLine 代表时间字段所在的列,INTERVAL '1' DAY 表示时间间隔为一天。
二、滑动窗口
特点:滑动窗口有固定的大小,与滚动窗口不同的是滑动窗口可以通过 slide 参数控制滑动窗口的创建频率。需要注意的是,多个滑动窗口可能会发生数据重叠:
滑动窗口的语法与滚动窗口相比,只多了一个 slide 参数:
1 SELECT 2 3 [gk], 4 5 [HOP_START(timeCol, slide, size)] , 6 7 [HOP_END(timeCol, slide, size)], 8 9 agg1(col1), 10 11 ... 12 13 aggN(colN) 14 15 FROM Tab1 16 17 GROUP BY [gk], HOP(timeCol, slide, size)
如:每间隔一小时计算一次过去 24 小时内每个商品的销量:
SELECT product, SUM(amount) FROM Orders GROUP BY HOP(rowtime, INTERVAL '1' HOUR, INTERVAL '1' DAY), product
上述案例中的 INTERVAL '1' HOUR 代表滑动窗口生成的时间间隔
三、会话窗口
定义:会话窗口定义了一个非活动时间,假如在指定的时间间隔内没有出现事件或消息,则会话窗口关闭
SELECT [gk], SESSION_START(timeCol, gap) AS winStart, SESSION_END(timeCol, gap) AS winEnd, agg1(col1), ... aggn(colN) FROM Tab1 GROUP BY [gk], SESSION(timeCol, gap)
如:需要计算每个用户过去 1 小时内的订单量
SELECT user, SESSION_START(rowtime, INTERVAL '1' HOUR) AS sStart, SESSION_ROWTIME(rowtime, INTERVAL '1' HOUR) AS sEnd, SUM(amount) FROM Orders GROUP BY SESSION(rowtime, INTERVAL '1' HOUR), user
参考文章:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=81#/detail/pc?id=2040