Flink SQL 窗口聚合详解

2025-03-14 14:04:2666 次浏览

最佳答案

滚动窗⼝(TUMBLE)定义:TUMBLE 窗口将每个元素分配给具有固定大小的窗口,这些窗口不重叠。若设定窗口大小为5分钟,Flink会每隔5分钟开启一个新的窗口,每条数据只划分到一个5分钟的窗口中。

应用场景:按分钟聚合数据,计算每分钟的PV和UV。实际案例:分维度分钟级别统计在线用户数、总销售额。

滚动窗窗口在 Flink 1.13 版本前和后分别有 Group Window Aggregation 和 Windowing TVF 实现方式。

Group Window Aggregation 方案(支持 Batch\Streaming 任务):在 SQL 的 GROUP BY 子句中声明 TUMBLE window,例如 tumble(row_time, interval '1' minute),其中 row_time 是事件时间的时间戳,interval '1' minute 是窗口大小。

Window TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明 TUMBLE window,包括:TABLE source_table 声明数据源表,DESCRIPTOR(row_time) 声明数据源的时间戳字段,INTERVAL '60' SECOND 声明窗口大小为1分钟。

实时场景 SQL 语义:假设 Orders 为 Kafka,target_table 也为 Kafka,生成的实时任务执行时,会产生三个算子:数据源算子(From Order),连接到 Kafka topic,实时读取数据,发送至下游窗口聚合算子;窗口聚合算子(TUMBLE 算子),接收数据并按时间戳划分至对应窗口;数据汇算子(INSERT INTO target_table),接收数据并写入到 target_table Kafka 中。

注意:事件时间中滚动窗口的计算触发由 Watermark 推动。

滑动窗窗口(HOP)定义:滑动窗口将元素分配给固定长度的窗口,有窗口大小的概念,不同之处在于滑动窗口具有滑动步长参数,如果步长小于窗口大小,则窗口之间可以重叠,一条数据可能分配到多个窗口。

应用案例:计算同时在线用户数,每分钟输出一次,计算过去5分钟的数据。

滑动窗窗口在 Flink 1.13 版本中通过 Group Window Aggregation 和 Windowing TVF 方案实现。

Group Window Aggregation 方案(支持 Batch\Streaming 任务):在 GROUP BY 子句中声明滑动窗口,包含事件时间的时间戳字段、滑动步长和窗口大小。

Windowing TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明滑动窗口,包括 TABLE source_table 声明数据源表、DESCRIPTOR(row_time) 声明数据源的时间戳、INTERVAL '1' MINUTES 和 INTERVAL '5' MINUTES 分别声明滑动步长和窗口大小。

Session 窗口定义:Session 时间窗口不同于滚动和滑动窗口,没有固定持续时间,如果在定义的间隔内没有新数据出现,则 Session 窗口关闭。

实际案例:计算每个用户在活跃期间(一个 Session)购买的商品数量,如果用户5分钟内没有活动,则 Session 结束。

Flink SQL 1.13 版本中仅支持 Group Window Aggregation 方案的 Session 窗口。

Group Window Aggregation 方案(支持 Batch\Streaming 任务):Session 窗口声明写在 GROUP BY 子句中,包含事件时间的时间戳和 Session gap 间隔。

渐进式窗口(CUMULATE)定义(仅支持 Streaming 任务):渐进式窗口首先创建一个最大窗口大小的滚动窗口,然后根据用户设置的触发时间间隔将其拆分为多个具有相同窗口起点和不同窗口终点的窗口。

示例:绘制从每日常规到当前分钟的累积 UV,10:00 时的 UV 表示从 00:00 到 10:00 的 UV 总数。

应用场景:周期内累计 PV、UV 指标(如每天累计至当前分钟的 PV、UV),这类指标是周期内的累计状态。

实际案例:每天截止当前分钟的累计 money(sum(money))、去重 id 数(count(distinct id)),渐进式窗口大小为1天,移动步长为分钟级别。

明细输入数据:预期输出数据,每分钟的输出结果都是当天零点累计到当前的结果,渐进式窗口仅支持 Windowing TVF 方案。

Windowing TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明 CUMULATE window,包括:TABLE source_table 声明数据源表、DESCRIPTOR(row_time) 声明数据源的时间戳、INTERVAL '60' SECOND 声明触发步长为1分钟、INTERVAL '1' DAY 声明窗口大小为1天。

Window TVF 支持 Grouping Sets、Rollup、Cube 应用场景:多个维度组合计算,Grouping Sets 将维度组合写在一条 SQL 中,方便且执行效率高,仅在 Window TVF 中支持。

示例:计算每日常规累计到当前分钟的汇总、age、sex、age+sex 维度的用户数。

Flink SQL 中 Grouping Sets 语法与 Hive SQL 有所不同,使用 Hive SQL 实现上述 SQL 的语义,如下所示:

声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。