重跑安全靠批次标记
SCD 加载要支持重跑:同一天任务失败后重跑,结果必须与第一次成功执行完全一致。关键做法是给本批产生的版本打上批次标记,重跑时先删除该批次写入的版本,再回滚本批关闭掉的旧版本区间,然后重新执行合并逻辑。
基本信息
| 批次标记 | batch_id 或 load_ts 审计列写在维度表上 |
|---|---|
| 重跑步骤 | 删本批新版本、回滚本批关闭动作、重新执行合并 |
| 验证方式 | 区间连续性检查与每键单当前行检查 |
| 无标记代价 | 只能全量重建,代价高且影响下游 |
| 平台差异 | Hive 按分区覆盖,Doris 按唯一键 upsert |
典型使用场景
- 任务失败重跑:同一天多次执行结果保持一致
- 口径修复:修正合并逻辑后重跑历史批次
- 补数操作:窗口合并后按批次重放
- 上线回滚:新逻辑有问题时回滚到上一批次结果
- 审计核对:按批次标记追溯某天的维度变更来源
按批次清理与重放
按批次清理与重放
-- 重跑:先清理本批写入的版本,再重放合并逻辑
DELETE FROM dim_customer WHERE batch_id = :batch_id;
-- 回滚本批关闭动作:把被本批关闭且实际仍生效的区间打开
-- UPDATE dim_customer
-- SET end_date = '9999-12-31', is_current = 1
-- WHERE batch_id = :batch_id AND close_reason = 'batch';
-- 重放后校验:每个自然键只能有一个当前行
-- SELECT customer_id, count(1) FROM dim_customer
-- WHERE is_current = 1 GROUP BY customer_id HAVING count(1) > 1;重跑四阶段
| 阶段 | 动作 | 校验点 |
|---|---|---|
| 清理 | 删除本批新版本 | 行数回到批次执行前 |
| 回滚 | 恢复本批关闭的旧区间 | 每个键都存在当前行 |
| 重放 | 重新执行合并逻辑 | 结果与首次执行一致 |
| 验证 | 区间连续性检查 | 区间无重叠、无空洞 |
没有批次标记时只能全量重建:不仅耗时长,重建期间下游还会读到不一致的中间状态,因此批次列应当在建表时就加上。
重跑要同时恢复被关闭的旧区间:只删新版本而不回滚关闭动作,会出现没有任何当前行的自然键,下游关联时直接丢行。