首页 > 技术文章 > Flink 窗口函数

zxz123 2021-08-26 23:43 原文

         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)
View Code

如计算每个用户每天的订单数量:

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)
View Code

如:每间隔一小时计算一次过去 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)
View Code

如:需要计算每个用户过去 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

推荐阅读