数据质量规则发现重复主键,表示在给定校验范围内,一个业务键对应多条记录。它是定位入口,不是根因结论。重复可能从采集重放开始,也可能由转换扩行、键值规范化碰撞或目标表并发写入造成。排查应以同一批样本为线索,沿采集、转换、落库逐段验证,并记录重复首次出现的位置。
先固定口径:明确主键字段及复合键组合,指定批次、分区、时间范围和表的快照时点。保存重复键、出现次数、原始来源标识、事件时间、采集时间及处理批次,避免排查期间样本范围变化。
按来源标识和记录内容将样本分类:同一事件标识重复,优先检查重试或重复投递;不同事件标识共用业务键,需验证键的唯一性范围、租户或来源命名空间;键相同但内容不同,还需确认它们是合法更新、并发版本,还是错误覆盖。主键是否重复取决于业务定义,不能仅凭时间相同或字段相似作判断。
同时比较原始键与标准化键。去空格、统一大小写、类型转换、截断或填充默认值,都可能让原先不同的值变成同一个键。可在分析记录中保留原始值和转换后值,并使用一致的空值处理规则。🔑
从重复键回查原始消息、文件行或变更记录,检查源端事件编号、分区偏移、文件标识、行号、采集任务运行号与事件时间。相同事件编号和偏移多次出现,通常指向任务重跑、超时重试、位点提交时序或相邻采集窗口重叠。若不同事件编号映射到同一业务键,则应回查上游键规则和源端变更语义。
诊断指标可包括输入行数、唯一事件数、重试次数、位点推进量、重复事件数及窗口交叠量。事件时间相同只是线索,不能单独作为重复判据;还应确认重试时事件标识是否稳定,以及迟到数据是否会被再次纳入窗口。📨
对每个转换步骤记录输入行数、输出行数、唯一键数、重复键数和最大重数。若某节点行数增加,检查一对多关联、维表重复匹配、数组展开、补数逻辑和过滤条件。若只在连接后重复,核验连接键是否包含租户、有效期或版本条件,以及维表是否满足预期的一对一关系。🧩
若重复在键映射或清洗后出现,检查大小写折叠、空白清理、精度转换、长度截断、空值填充和复合键拼接分隔符。需要时对少量样本保留逐步追踪记录,使每条输出能对应到输入行和转换规则。全局行数没有变化也不代表没有扩行,因为新增行可能同时被过滤。
在写入前的阶段数据仍唯一、目标表却出现重复时,检查表约束是否实际生效,写入方式是追加还是合并,合并条件是否与质量校验所用业务键相同。并发任务可能同时判断某键不存在并各自插入;事务重试、部分提交后的恢复也可能重复提交同一批数据。核对写入批次、提交结果、重试记录和并发运行时间线。
建议统一口径计算指标,例如重复率 = 重复主键涉及行数 ÷ 校验范围内总行数,并同时记录重复键数、最大重数、写入前后唯一键差值。指标应带有批次与范围;只看全表重复率可能掩盖单个分区或重跑批次的问题。📊
固定样本:保存重复键、批次和校验范围,确认主键定义及空值规则。
检查原始层:比对事件标识、偏移或行号,区分源端重复、重试和窗口重叠。
逐段检查转换:从原始数据向后比较行数、唯一键数和最大重数,定位首次出现重复的节点。
核对落库:检查约束、合并条件、事务重试与并发写入,确认目标行为和业务键一致。
小范围验证:一次调整一个环节,使用隔离批次复现,并覆盖重复运行、迟到数据和并发等相关场景。
验收要看:同一输入批次重复运行后,目标唯一键集合和业务结果保持一致;各阶段的行数变化可解释;重复键数、最大重数和重试指标符合预设阈值。还应验证合法更新不会被去重逻辑误删。
仅删除重复行、随意保留最新记录,可能掩盖重放机制,也可能丢掉有效更新。事件时间较新不必然代表数据更正确;全局总量稳定也不能证明每个键无重复。适用的修复方式取决于业务键定义、上游事件语义和写入模型,不能用一个去重规则替代这些判断。
最终排查记录应写明重复首次出现的链路节点、支持结论的样本与指标、修复所在环节、回归范围及监控口径。以可重复的批次验证证明修复生效,后续再用相同指标持续发现重放、扩行或写入竞态。🧾