1.什么是窗口函数
Flink窗口函数是指对数据流中的数据进行分组和聚合操作的函数。
FlinkSQL支持对一个特定的窗口的聚合。例如有用户想统计在过去的1分钟内有多少用户点击了某个的网页。在这种情况下,我们可以定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。
在Flink中,窗口函数可以分为两种类型:时间窗口和计数窗口。时间窗口是指按照时间对数据流进行分组和聚合操作。计数窗口是指按照数据条数对数据流进行分组和聚合操作。
FlinkSQL支持的窗口聚合主要是两种:window aggregate和over aggregate。他们最核心的区别是over aggregate从语义上保障了对每个输入都有一个输出,因此over agregate常被用于ranking,moving average等场景。
Window aggregate支持两种时间类型做窗口:Event Time和Processing Time。每种类型下,又分别支持三种窗口类型:滚动窗口(TUMBLE),滑动窗口(HOP)和会话窗口(SESSION)。
2.时间类型
BlinkSQL支持两种时间:
- Event Time:用户提供的事件时间(通常是数据的最原始的创建时间),event time一定是用户提供在表的schema里的数据
- Processing Time:表示系统对事件进行处理的本地系统时间
具体见上篇文章。Flink时间属性_土豆马铃薯的博客-CSDN博客
3.实时计算中的窗口类型
3.1滚动窗口(Tumble Window)
滚动窗口将每个元素分配到一个指定窗口大小的窗口中,滚动窗口有一个固定的大小,并且不会出现重叠。例如:如果指定了一个5分钟大小的滚动窗口,那么无限流的数据会根据时间划分成[0:00 - 0:05), [0:05, 0:10),[0:10, 0:15)... 等窗口。如下图展示了一个 30秒大小的滚动窗口划分。
函数语法:用在GROUP BY子句中,定义window。
TUMBLE(time_attr, size_interval)
说明:
1. time_attr:参数必须是流中的一个合法的时间属性字段,即指定了 processing time 或是 event time;
2. size_interval:窗口时间间隔;
使用案例:
INSERT INTO dts_ds_merchant_target
SELECT
SUM(buy_amount) AS totalsale,
TUMBLE_START(ROWTIME, INTERVAL '10' SECOND) AS tms,
TUMBLE_END(ROWTIME, INTERVAL '1' SECOND) AS tme
FROM dts_ds_merchant_source
GROUP BY tumble(ROWTIME, INTERVAL '1' SECOND)
3.2滑动窗口(Slide Window)
定义一个跳跃的时间窗口(在 Table API 中称为滑动窗口)。滑动窗口有一个固定的持续时间( 第二个interval 参数 )以及一个滑动的间隔(第一个 interval 参数 )。若滑动间隔小于窗口的持续时间,滑动窗口则会出现重叠;因此,行将会被分配到多个窗口中。比如,一个大小为 15 分组的滑动窗口,其滑动间隔为 5 分钟,将会把每一行数据分配到 3 个 15 分钟的窗口中。滑动窗口可以定义在事件时间(批处理、流处理)或处理时间(流处理)上。
函数语法:用在GROUP BY子句中,定义window。
HOP(time_attr, slide_interval, size_interval)
说明:
1. time_attr:参数必须是流中的一个合法的时间属性字段,即指定了 processing time 或是 event time;
2. slide_interval:滑动窗口的滑动时间间隔;
3. size_interval:滑动窗口的固定时间间隔;
使用案例:
INSERT INTO dts_ds_slide_target
SELECT
SUM(buy_amount) AS totalsale,
HOP_START(ROWTIME, INTERVAL '30' SECOND ,INTERVAL '5' MINUTE ) as hops,
HOP_END(ROWTIME, INTERVAL '30' SECOND ,INTERVAL '5'MINUTE ) as hope
FROM dts_ds_merchant_source
GROUP BY HOP(ROWTIME, INTERVAL '30' SECOND ,INTERVAL '5' MINUTE )
3.3会话窗口(Session Window)
定义一个会话时间窗口。会话时间窗口没有一个固定的持续时间,但是它们的边界会根据 interval 所定义的不活跃时间所确定;即一个会话时间窗口在定义的间隔时间内没有时间出现,该窗口会被关闭。例如时间窗口的间隔时间是 30 分钟,当其不活跃的时间达到30分钟后,若观测到新的记录,则会启动一个新的会话时间窗口(否则该行数据会被添加到当前的窗口),且若在 30 分钟内没有观测到新纪录,这个窗口将会被关闭。会话时间窗口可以使用事件时间(批处理、流处理)或处理时间(流处理)。
函数语法:用在GROUP BY子句中,定义window。
SESSION(time_attr, interval)
说明:
1. time_attr:参数必须是流中的一个合法的时间属性字段,即指定了 processing time 或是 event time;
2. interval:会话窗口的gap时间间隔;
使用案例:
NSERT INTO dts_ds_session_target
SELECT
id as id,
SUM(buy_amount) AS totalsale,
SESSION_START(ROWTIME, INTERVAL '10' SECOND ) as sws,
SESSION_END(ROWTIME, INTERVAL '10' SECOND ) as swe
FROM dts_ds_merchant_source
GROUP BY id,SESSION(ROWTIME, INTERVAL '10' SECOND )