news 2026/10/25 18:09:37

Flink SQL Deduplication用 ROW_NUMBER 做流式去重

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink SQL Deduplication用 ROW_NUMBER 做流式去重

1. Deduplication 是什么,为什么流式场景尤其需要

Deduplication(去重)是在一组列(去重键)上移除重复行,只保留第一条或最后一条记录。典型原因是:上游 ETL 不是端到端 exactly-once,故障恢复/重试可能把同一业务事件写了多次,导致下游 SUM/COUNT 等统计被“重复行”污染,所以需要在进一步分析前先做去重。(Apache Nightlies)

从实现角度看,Flink SQL 的去重本质上就是 Top-N 的特例:N = 1,并且按处理时间或事件时间排序。(Apache Nightlies)

2. Flink SQL 去重的标准写法(优化器识别模式)

2.1 QUALIFY 写法(更简洁)

官方给出的 Deduplication 语法是:对去重键PARTITION BY,按时间属性ORDER BY,保留ROW_NUMBER() = 1。(Apache Nightlies)

SELECT[column_list]FROMtable_name QUALIFY ROW_NUMBER()OVER(PARTITIONBYcol1[,col2...]ORDERBYtime_attr[ASC|DESC])=1;

2.2 子查询 + WHERE rownum = 1(更通用,适配更多版本)

很多生产环境更习惯用这版(逻辑更直观),并且必须包含rownum = 1,否则优化器可能无法把它翻译成 Deduplicate 算子。(Apache Nightlies)

SELECT[column_list]FROM(SELECT*,ROW_NUMBER()OVER(PARTITIONBYcol1[,col2...]ORDERBYtime_attr[ASC|DESC])ASrownumFROMtable_name)WHERErownum=1;

3. 参数语义:去重键、保留第一条/最后一条、必须是“时间属性”

3.1 PARTITION BY:去重键(deduplicate key)

PARTITION BY col1[, col2...]就是你判定“重复”的那组字段(比如 order_id、message_id、(user_id, item_id) 等)。(Apache Nightlies)

3.2 ORDER BY time_attr:决定保留第一条还是最后一条

排序列必须是时间属性(processing time 或 event time)。(Apache Nightlies)

  • ORDER BY time_attr ASC:保留最早的一条(first row)
  • ORDER BY time_attr DESC:保留最新的一条(last row)(Apache Nightlies)

3.3 处理时间 vs 事件时间:结果是否“可复现”

经验上强烈建议优先用事件时间(rowtime)做去重排序:
一些调优/最佳实践文档也明确指出:按 processing time 去重,结果会随运行时机波动;按 event time 去重,结果更确定、更可复现。(Ververica 文檔)

4. 示例:按 order_id 去重,只保留第一次出现(你给的 Orders 例子)

CREATETABLEOrders(order_id STRING,userSTRING,product STRING,numBIGINT,proctimeASPROCTIME())WITH(...);-- 按 order_id 去重,保留第一次出现(ASC)SELECTorder_id,user,product,numFROM(SELECT*,ROW_NUMBER()OVER(PARTITIONBYorder_idORDERBYproctimeASC)ASrow_numFROMOrders)WHERErow_num=1;

这个模式正是 Flink 官方去重示例中强调的写法:ROW_NUMBER + 分区键 + 时间排序 +rownum = 1。(Apache Nightlies)

5. 去重的 Changelog 语义:为什么下游可能会看到 UPDATE/撤回

流式去重不是“简单过滤一次”——当更早/更晚的记录到来时(尤其事件时间乱序),去重结果可能需要被修正,因此会产生changelog(更新流)。

在 Flink SQL 的 retract 机制里,更新通常会被拆成DELETE(-U)+INSERT(+U)两条事件(先撤回旧值,再发新值)。(Confluent)

工程结论:

  • 你的 sink/下游必须能消费更新流(upsert/retract),否则结果会错或写不进去。

6. Sink 选型建议:优先 Upsert 型(尤其写 Kafka / 外部库)

如果你把去重结果写入 Kafka,官方upsert-kafka明确支持消费 changelog:会把 INSERT/UPDATE_AFTER 写成正常消息,把 DELETE 写成 tombstone。(Apache Nightlies)

落外部存储(JDBC、KV、OLAP)时,同样建议使用Upsert 语义(主键一致),让“同一 key 的最新结果”被覆盖更新。

7. 状态与 TTL:去重会“记住 key”,不设 TTL 可能越跑越大

去重需要维护“某个 key 当前保留的是哪一条”,因此会占用 state。Flink Table/SQL 提供table.exec.state.ttl(Idle State Retention Time)用来控制 key 的状态多久没更新就清理。(Apache Nightlies)

注意:TTL 会影响正确性(清理太早可能把还会来的迟到数据当成“新 key”),一般需要结合业务延迟/乱序程度来定。

8. 进阶:Window Deduplication(每个窗口内去重)

如果你需要“每个窗口内按 key 去重”(例如 10 分钟内同一用户只保留最后一次点击),Flink 还有专门的Window Deduplication形态:同样要求ORDER BY是时间属性,且rownum = 1/<=1/<2这种固定谓词,才能让优化器识别。(Apache Nightlies)

9. 一页避坑清单(最常见 5 个坑)

  1. rownum = 1写错/写丢 → 优化器可能无法识别为 Deduplication。(Apache Nightlies)
  2. ORDER BY不是时间属性 → 不符合 Deduplication 语义要求。(Apache Nightlies)
  3. 用 processing time 去重却要求结果稳定 → 可能每次跑都不一样。(Ververica 文檔)
  4. 下游不支持更新流(append-only sink)→ 结果不正确或写入失败。(Confluent)
  5. 不设 TTL/不控状态 → key 越来越多时 state 可能持续膨胀。(Apache Nightlies)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 14:29:32

5分钟快速上手NI-VISA:虚拟仪器通信终极指南

5分钟快速上手NI-VISA&#xff1a;虚拟仪器通信终极指南 【免费下载链接】NI-VISA下载安装使用指南 NI-VISA&#xff08;Virtual Instrument Software Architecture&#xff09;是用于控制和通信的标准API&#xff0c;广泛应用于LabVIEW等虚拟仪器软件中。本资源文件提供了NI-V…

作者头像 李华
网站建设 2026/10/24 17:29:07

5个技巧让SSH连接像钢铁侠战衣一样坚不可摧

还在为SSH连接突然中断而抓狂吗&#xff1f;想象一下&#xff1a;你正在远程服务器上运行一个长达数小时的编译任务&#xff0c;突然网络抖动——所有进度瞬间归零&#xff0c;就像灭霸打了响指一样残酷。这种场景对于开发者来说简直是"数字噩梦"&#xff0c;但别担心…

作者头像 李华
网站建设 2026/10/25 12:03:34

AI写论文终极测评:宏智树AI凭何成为“学术救星”中的隐藏冠军?

当毕业季的倒计时与论文DDL同时逼近&#xff0c;AI写论文工具成了无数学生的“救命稻草”。但市场鱼龙混杂&#xff1a;有的工具生成的文献是虚构的&#xff0c;有的逻辑混乱到导师看一眼就皱眉&#xff0c;还有的查重时AIGC率直接“爆表”。AI写论文哪个软件最好&#xff1f; …

作者头像 李华
网站建设 2026/10/25 3:14:02

PPT模板哪家好:2025年12月深度测评排名前五推荐

PPT模板哪家好&#xff1a;2025年深度测评排名前五推荐在数字化办公场景中&#xff0c;PPT已成为职场人、教师、活动策划者的核心工具。然而&#xff0c;模板质量参差不齐、设计同质化、下载收费混乱等问题&#xff0c;让用户陷入“选模板难”的困境。 本次测评聚焦PPT模板领域…

作者头像 李华
网站建设 2026/10/25 6:28:57

GB28181协议终极测试指南:自动化工具完整解决方案

GB28181协议终极测试指南&#xff1a;自动化工具完整解决方案 【免费下载链接】GB28181自动化测试工具 GB28181自动化测试工具是一款专为GB28181协议设计的测试解决方案&#xff0c;帮助用户快速、高效地完成协议自动化测试。工具经过严格测试&#xff0c;确保稳定可用&#xf…

作者头像 李华