You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除行级重复数据?MERGE INTO去重致数据丢失求助

解决MERGE INTO去重时误删所有重复行的问题

Spark的df.dropDuplicates()默认会保留重复组中的第一行(或根据分区/排序规则保留指定行),但如果你的MERGE INTO语句未做行筛选逻辑,就会把所有重复行直接删除,导致数据丢失。

正确的MERGE INTO去重逻辑(保留一条重复行)

要实现和dropDuplicates()一致的效果,需先在数据中标记出要保留的行,再通过MERGE INTO只删除冗余的重复项。以保留每组重复数据中最新的一条(按时间戳或自增ID排序)为例:

  1. 标记需保留的行
    用窗口函数按去重键分组排序,给每组中要保留的行打标记:

    WITH ranked_data AS (
      SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY col1, col2, ...  -- 填写用于判断重复的列
                           ORDER BY update_time DESC) AS rn  -- 按更新时间倒序,保留最新行
      FROM your_target_table
    )
    

    其中rn = 1是要保留的行,rn > 1为需删除的重复行。

  2. 执行MERGE INTO删除冗余行
    关联目标表与标记后的数据集,仅删除多余的重复行:

    MERGE INTO your_target_table t
    USING ranked_data s
    ON t.primary_key = s.primary_key  -- 用主键或唯一标识精准匹配行
    WHEN MATCHED AND s.rn > 1 THEN
      DELETE
    

关键注意点

  • 若没有主键,可使用所有列的组合关联,但会影响执行性能
  • 要完全匹配dropDuplicates()保留分组第一行的逻辑,可将ORDER BY改为按数据原始插入顺序(如自增ID升序)
  • 执行前务必在测试环境验证逻辑,避免再次出现数据丢失

内容的提问来源于stack exchange,提问作者muskanbeig musk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:04:50