news 2026/7/2 4:31:27

Flink SQL Window Deduplication按窗口“保留第一条/最后一条”记录(Streaming)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink SQL Window Deduplication按窗口“保留第一条/最后一条”记录(Streaming)

1. Window Deduplication 是什么

Window Deduplication 是 Deduplication(去重)的窗口版本:在每个窗口(window)+ 分区键(partition keys)内,对重复行做去重,只保留第一条最后一条。(nightlies.apache.org)

它和“连续表去重(Regular Deduplicate)”最大的区别在于:

  • 连续去重:结果可能随每条新记录到来而不断更新;
  • 窗口去重:不输出中间结果,只在窗口结束时输出最终结果,并且窗口结束后会清理中间状态,所以如果你不需要“逐条更新”,窗口去重往往更省资源、吞吐更好。(nightlies.apache.org)

直觉理解:Window Deduplication ≈ Window Top-N 的特例(N=1),同样基于ROW_NUMBER()。(nightlies.apache.org)

2. 必须满足的优化器识别条件(写错就不会翻译成 Window Dedup)

2.1 必须来自 Windowing TVF 的结果(包含 window_start/window_end)

窗口去重通常直接跟在 Windowing TVF(TUMBLE/HOP/CUMULATE/SESSION)后使用;Windowing TVF 会生成window_startwindow_endwindow_time三列。(nightlies.apache.org)

2.2 PARTITION BY 必须包含 window_start 和 window_end

PARTITION BY必须包含window_start, window_end(再加你的业务分区键),否则优化器无法翻译为 Window Deduplication。(nightlies.apache.org)

2.3 WHERE 必须是这三种谓词之一:=1/<=1/<2

窗口去重对过滤谓词也很“死板”:必须是rownum = 1rownum <= 1rownum < 2,否则优化器不认。(nightlies.apache.org)

3. 标准语法模板(直接套用)

(nightlies.apache.org)

SELECT[column_list]FROM(SELECT[column_list],ROW_NUMBER()OVER(PARTITIONBYwindow_start,window_end[,col_key1...]ORDERBYtime_attr[ASC|DESC])ASrownumFROMtable_name-- 必须是应用了 Windowing TVF 的关系)WHERE(rownum=1ORrownum<=1ORrownum<2)[ANDother_conditions];

4. 参数语义:保留“第一条”还是“最后一条”

4.1 PARTITION BY:窗口 + 去重键

  • window_start, window_end:代表“在每个窗口内”
  • col_key1...:你真正的去重键(例如order_id/user_id/item等)(nightlies.apache.org)

4.2 ORDER BY time_attr:决定保留第一条/最后一条

排序字段必须是时间属性。窗口去重里:

  • ASC:保留窗口内最早的一条(first)
  • DESC:保留窗口内最晚的一条(last)(nightlies.apache.org)

5. 示例:每 10 分钟窗口保留“最后一条记录”

下面这个例子与你给的示例一致:对每个 10 分钟 TUMBLE 窗口,按事件时间bidtime倒序取rownum <= 1,就保留了每个窗口内最后一条。(nightlies.apache.org)

SELECT*FROM(SELECTbidtime,price,item,supplier_id,window_start,window_end,ROW_NUMBER()OVER(PARTITIONBYwindow_start,window_endORDERBYbidtimeDESC)ASrownumFROMTABLE(TUMBLE(TABLEBid,DESCRIPTOR(bidtime),INTERVAL'10'MINUTES)))WHERErownum<=1;

如果你想“每个窗口内按 item 去重,只保留最后一条”,只要把 item 加进分区键:

SELECT*FROM(SELECTbidtime,price,item,supplier_id,window_start,window_end,ROW_NUMBER()OVER(PARTITIONBYwindow_start,window_end,itemORDERBYbidtimeDESC)ASrownumFROMTABLE(TUMBLE(TABLEBid,DESCRIPTOR(bidtime),INTERVAL'10'MINUTES)))WHERErownum=1;

6. 限制与版本注意点(非常重要)

6.1 跟在 Windowing TVF 后时:暂不支持 Session Window

目前如果 Window Deduplication 直接跟在 Windowing TVF 后,TVF 只能是TUMBLE / HOP / CUMULATE,不支持 SESSION;Session window 预计后续支持。(nightlies.apache.org)

6.2 ORDER BY 的时间属性限制:当前要求事件时间

当前 Window Deduplication 的ORDER BY需要是事件时间属性(event time),处理时间(processing time)排序“未来会支持”。(nightlies.apache.org)

7. 生产踩坑清单(写之前对一下)

  1. PARTITION BY忘了带window_start, window_end→ 优化器不翻译。(nightlies.apache.org)
  2. WHERE写成rownum < 1rownum = 0等 → 不在认可谓词集合里。(nightlies.apache.org)
  3. ORDER BY不是时间属性 / 或用了 processing time(当前限制)→ 计划不通过或无法翻译。(nightlies.apache.org)
  4. 事件时间字段没有正确 watermark → 窗口无法按预期关闭(表现为“迟迟不出结果”);Windowing TVF 对时间属性有明确要求。(nightlies.apache.org)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 10:30:42

34、Bash脚本中的循环控制与故障排查

Bash脚本中的循环控制与故障排查 1. 循环控制 在Bash脚本中,循环是一种强大的工具,可用于重复执行特定的代码块。下面将介绍 while 、 until 循环以及如何在循环中控制程序流程。 1.1 while 循环 while 循环会在条件为真时持续执行代码块。以下是一个简单菜单程序…

作者头像 李华
网站建设 2026/6/30 13:22:16

直接撸起袖子开干!今天咱们聊聊怎么用LabVIEW整一个带报警记录的上位机监控系统。这玩意儿在工业现场特别实用,尤其是需要24小时盯着设备状态的时候

labview上位机监测报警记录&#xff0c;状态显示。 报警记录存储&#xff0c;存储格式txt。 csv保存文件。先看状态显示部分。LabVIEW的前面板放几个指示灯控件就能实时反映设备状态&#xff0c;比如用绿色圆形表示正常&#xff0c;红色三角表示报警。背后用个While循环不断读取…

作者头像 李华
网站建设 2026/6/30 22:00:18

基于A*算法的无人机三维动态避障路径规划设计,MATLAB编程实现

基于A* 算法的无人机三维路径规划算法&#xff0c;可以动态避障&#xff0c;自己可以规定设计障碍物位置&#xff0c;MATLAB编程实现。 无人机在三维空间耍杂技这事儿&#xff0c;靠的就是路径规划的真功夫。今天咱们来聊个硬核玩法——基于MATLAB实现的A*算法三维动态避障系统…

作者头像 李华
网站建设 2026/7/1 22:40:24

基于vue的宠物寄养机构管理系统_96zn64i1_springboot php python nodejs

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/7/1 22:37:12

20、GTK+ Tree View 开发指南

GTK+ Tree View 开发指南 1. 引言 在 GTK+ 开发中,Tree View 是一个非常重要的组件,它实现了 MVC(Model-View-Controller)模式中的视图部分。用户可以通过 Tree View 与数据进行交互,如选择行、展开或折叠树等。本文将详细介绍 GTK+ 中 Tree View 的相关函数、属性、信号…

作者头像 李华
网站建设 2026/7/1 18:54:15

22、文本缓冲区操作全解析

文本缓冲区操作全解析 1. 文本缓冲区基础 1.1 基本特性 文本缓冲区采用 UTF - 8 编码,这使得字节计数(索引)和字符计数(偏移量)有所不同。一个文本缓冲区至少包含一行(可能为空),除最后一行外,每行以行分隔符结尾,行分隔符被视为一个字符,它可以是 Unix 换行符、…

作者头像 李华