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