它解决什么问题
同一笔业务被导出了两次、系统重复推送、多个分支合并后出现重号 – 这些都要去重。它按你指定的列判断哪些行算「同一条」,然后只留一条。
它判的是业务重复,不是行 ID 重复。行 ID 重复是 KNIME 内部的唯一性冲突,报错会直接中止执行,那是另一回事。这个节点管的是「这两行在业务上是同一笔」。
它在流程里的位置
前面那个排序节点不是可有可无的。如果你打算「保留第一条」,那么哪一条算第一条完全由当前行序决定。
基本信息
| 英文原名 | Duplicate Row Filter |
|---|---|
| 中文名称 | 重复行处理(iModel 中文界面) |
| 输入端口 | 1 个数据表 |
| 输出端口 | 1 个。可以选择不删行、只加标记列,这样重复的行仍然在表里但被标出来了 |
| 是否改变行数 | 取决于处理方式:只留一条会变少,加标记列则不变 |
配置项逐条
-
判重列Choose columns
拿哪几列判断两行是否相同。这一项决定一切。选「资产编号」,编号相同就算重复;选全部列,则要每一列都一样才算重复。两种结果差得很远。
实务上多数场景该选业务主键那一两列,不该选全部。全选的话,只要有一列多了个空格就判不出重复。
-
重复行如何处理Duplicate rows handling
只保留一条,还是全部保留但加两列标记(哪些是重复的、它跟谁重复)。做数据核对时优先选加标记列 – 先看清楚重复了多少、都是些什么,再决定删不删。直接删是不可逆的。
-
保留哪一条Row selection
三种:第一条、最后一条、或者按某一列取最大或最小的那条。按列取是最稳的做法 – 比如同一个资产编号有多条记录时保留「更新时间」最大的那条,结果不依赖行序。
选「第一条」或「最后一条」就必须先排序,否则每次跑出来留下的可能不是同一条。
Duplicate Row Filter 配置对话框
判重列Choose columns
资产编号
选业务主键,别全选。全选时一个空格就会让重复判不出来。
重复行如何处理
只保留一条保留全部并加标记列
核对阶段先加标记看清楚,确认无误再改成只留一条。
保留哪一条Row selection
第一条最后一条按「更新时间」取最大
按列取最不依赖行序,重跑结果稳定。
三个常见坑
- 明明有重复却判不出来。判重列里有看不见的差异:前后空格、全角半角、大小写。去重之前先用 String Manipulation 把判重列统一一遍 – 这一步几乎是必需的。
- 每次跑留下的记录不一样。选了「保留第一条」但上游没有确定的排序。修法是前面加 Sorter,或者改成按某一列取最大最小。
- 把不该合并的合并了。判重列选得太少。比如只按「资产编号」判重,但同一编号在不同年度各有一条记录,这两条其实都该留。判重列要选到能唯一标识一条业务记录的粒度。
什么时候该换别的节点
| 情况 | 换成 |
|---|---|
| 不只去重,还要对重复的几条做汇总 | GroupBy,按业务键分组再聚合 |
| 要处理的是行 ID 重复报错 | RowID 节点重排,或调 Concatenate 的重复处理方式 |
| 只想看看有没有重复,不动数据 | GroupBy 按业务键计数,看有没有大于 1 的 |
| 要按另一张表剔除记录 | Reference Row Filter |

