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)

sql 复制代码
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:窗口 + 去重键

  • 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)

sql 复制代码
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 加进分区键:

sql 复制代码
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)
相关推荐
manok27 分钟前
探索研究:军用领域软件工厂建设核心路径——可信仓库与SBOM驱动的安全高效研发模式
大数据·人工智能·安全·软件工厂
人机与认知实验室1 小时前
机器人“拟人化”的演进:融合人机环境生态系统智能的前沿探索
大数据·机器人
中科天工1 小时前
如何选择适合的自动化包装解决方案?
大数据·人工智能·智能
song150265372981 小时前
PLC电气控制柜 开发上位机软件
大数据
老胡全房源系统1 小时前
房产中介管理系统哪一款适合中介?
大数据·人工智能
dear_bi_MyOnly2 小时前
数据分析常用操作汇总
大数据·python·数据挖掘·数据分析·学习方法
YangYang9YangYan2 小时前
2026高职大数据专业:数据分析学习的价值与前景
大数据·学习·数据分析
DX_水位流量监测2 小时前
水雨情在线监测系统的技术特性与实践应用
大数据·网络·人工智能·信息可视化·架构
sheji34162 小时前
【开题答辩全过程】以 基于Hadoop教育平台的设计与实现为例,包含答辩的问题和答案
大数据·hadoop·分布式
冷存储观察2 小时前
Gigaom雷达报告反映的非结构化数据管理技术应用趋势
大数据·人工智能·云计算·数据安全·企业数据管理·数据基础设施