一句话定义
行 ID 是 KNIME 自动给每一行分配的唯一标识,默认长成 Row0、Row1 这样。它独立于你的数据列,作用相当于数据库里的主键。
它和你的业务编号是两码事。资产编号、工号、订单号都是普通数据列,允许重复。只有最左边那一列受唯一性约束。这两个概念搞混,排查方向会整个跑偏。
为什么要有它
KNIME 的每个节点都能点开看中间结果,你还能把不同分支的结果对照着看。要做到这一点,系统必须能稳定地指认「这一行是哪一行」 – 靠列的组合是不够的,因为列可能被过滤掉、被改名、被聚合。行 ID 就是那个不随列变化的锚点。
它也是拼表时唯一性校验的依据。这解释了为什么 Concatenate 会因为行 ID 撞车而直接中止执行。
哪些操作会改变它
| 操作 | 行 ID 会怎样 |
|---|---|
| 读取节点默认读入 | 从 Row0 开始重新编号 |
| 读取时指定某列作行 ID | 用那一列的值当行 ID – 那列如果有重复就会报错 |
| Row Filter 筛掉一些行 | 不变。留下的行保持原编号,所以看起来是跳号的,这是正常的 |
| Sorter 排序 | 不变。行 ID 跟着行走,排完看起来乱序 |
| Concatenate 纵向拼表 | 各输入表的行 ID 会撞车,要按配置加后缀或提前重排 |
| GroupBy 分组汇总 | 重新生成 – 输出是每组一行,原来的行 ID 没有意义了 |
| RowID 节点 | 专门用来重新生成或指定行 ID |
两个实用结论
- 不要拿业务编号当行 ID。需要按它关联就用 Joiner,需要按它去重就用 Duplicate Row Filter,两件事都不必动行 ID。一旦拿业务编号当行 ID,那一列出现重复就直接中止执行。
- 凡是要纵向拼接的分支,拼之前各接一个 RowID 节点重排。行 ID 本来就不承载业务含义,重排不丢任何信息,却能从根上避开撞车。这个习惯比出错再回来查便宜得多。
相关内容
| 页面 | 相关点 |
|---|---|
| Duplicate row ID 行 ID 重复 | 撞车报错的三种场景与修法 |
| Concatenate 行合并 | 拼表时行 ID 处理方式的取舍 |
| Sorter 排序器 | 为什么排完序行 ID 看起来是乱的 |
| Row Filter 行筛选器 | 筛完之后行 ID 跳号是正常的 |

