当前位置: 首页 > news >正文

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

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

1. Window Deduplication 是什么

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

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

直觉理解: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 (
PARTITION BY window_start, window_end [, col_key1...]
ORDER BY time_attr [ASC|DESC]
) AS rownum
FROM table_name  -- 必须是应用了 Windowing TVF 的关系
)
WHERE (rownum = 1 OR rownum <= 1 OR rownum < 2)
[AND other_conditions];

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

4.1 PARTITION BY:窗口 + 去重键

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 (
SELECT
bidtime, price, item, supplier_id, window_start, window_end,
ROW_NUMBER() OVER (
PARTITION BY window_start, window_end
ORDER BY bidtime DESC
) AS rownum
FROM TABLE(
TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES)
)
)
WHERE rownum <= 1;

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

SELECT *
FROM (
SELECT
bidtime, price, item, supplier_id, window_start, window_end,
ROW_NUMBER() OVER (
PARTITION BY window_start, window_end, item
ORDER BY bidtime DESC
) AS rownum
FROM TABLE(
TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES)
)
)
WHERE rownum = 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)
http://www.jsqmd.com/news/280529/

相关文章:

  • Windows系统优化工具RyTuneX1.6.0 完全安装配置指南,Win10 Win11优化指南
  • MemOS记忆图谱实战:从零构建LangChain智能体的长期记忆系统(含完整代码)
  • 【计算机毕业设计案例】基于springboot的婚庆公司相亲主持服务平台的设计与实现(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于Java springboot实验室预约系统实验室设备租赁设备报修维修报废(程序+文档+讲解+定制)
  • 大模型未来已来:从ChatGPT到Agentic AI的收藏级进阶指南
  • 一文读懂Qwen3-VL-EmbeddingReranker:多模态检索新标杆,收藏学习!
  • 大模型项目实战宝典:从6B到65B模型训练,含LoRA/QLoRA/RLHF等热门技术,建议收藏
  • Java毕设选题推荐:基于spring boot的开放实验室设备租赁报修预约管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 强联通分量及缩点
  • whk 趣事一则
  • etcd集群备份与恢复
  • Java毕设项目:基于springboot的实验设备借用平台的设计与实现 实验室设备租赁系统(源码+文档,讲解、调试运行,定制等)
  • 第 476 场周赛Q1——3745. 三元素表达式的最大值
  • 构建企业级AI会议助手:会议记录与行动项跟踪
  • hhwdd:这些不都是基础练习吗?
  • Kubernetes 部署、维护nginx服务
  • 【课程设计/毕业设计】基于springboot + vue房屋租赁管理系统基于springboot的元宇宙平台的房屋租赁管理系统【附源码、数据库、万字文档】
  • 第75天(中等题 数据结构)
  • 救命!AIGC太高怎么办?手把手教你降AI率:10款神器大盘点(内含白嫖攻略)
  • 计算机Java毕设实战-基于springboot的在线云平台的房屋租赁管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【大数据毕设源码分享】基于Python大数据技术的广东旅游数据可视化分析的设计与实现(程序+文档+代码讲解+一条龙定制)
  • Linux 查找 /sys/bus/usb/devices 对应串口文件
  • YOLOv8改进 - 注意力机制 | CoTAttention (Contextual Transformer Attention) 上下文转换器注意力通过静态与动态上下文协同建模增强视觉表征
  • 【大数据毕设源码分享】基于python+Hadoop+数据可视化的租房数据分析系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • C#/.NET/.NET Core技术前沿周刊 | 第 66 期(2026年1.12-1.18)
  • 实用指南:清楚易懂的红黑树讲解
  • Java计算机毕设之基于springboot的元宇宙平台的房屋租赁管理系统基于springboot + vue房屋租赁管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 迈向意义共治的智能文明:一份关于AI时代新范式的框架性阐述
  • 学习日记之狂神说Java
  • [note] 本地12+16G极限部署 Qwen3-Coder-25B 搭配Continue插件实现代码补全