脏数据有哪几种处置策略
发现脏数据之后不是只有“报错停下”一种选择,常见有四种:拦截(关键字段错误时阻断下游并告警,强一致优先)、隔离(错误行转隔离表,主流程继续)、放行并标注(容忍小比例错误但打上质量标记,下游可见)、降级(用前一日数据兜底并公告口径)。策略要按字段重要性与下游用途选择,并写进数据字典:金额、主键这类字段适合拦截,埋点类附加字段适合隔离或放行。
基本信息
| 拦截 | 关键字段错误即阻断下游,强一致优先 |
|---|---|
| 隔离 | 错误行进隔离表,主流程不中断 |
| 放行并标注 | 容忍小比例错误,但下游可见质量标记 |
| 降级 | 用前一日数据兜底,需公告口径变化 |
| 选择依据 | 字段重要性、下游用途、可容忍错误比例 |
典型使用场景
- 交易金额缺失:拦截下游,避免按错数结算
- 来源格式变更导致的少量枚举越界:先隔离,保证主流程按时产出
- 埋点附加字段异常:放行并打标记,让分析时自行选择是否使用
- 上游任务失败但报表必须按时发出:降级用前一日数据并公告
- 新数据源接入初期:先隔离加人工复核,稳定后收紧为拦截
隔离与标注写法
隔离与标注写法
-- 隔离:把主键重复的行写入隔离表,主流程继续
INSERT INTO quarantine_orders
SELECT *, 'dup_pk' AS dq_reason, CURRENT_TIMESTAMP() AS dq_time
FROM stage_orders
WHERE order_id IN (
SELECT order_id FROM stage_orders GROUP BY order_id HAVING COUNT(*) > 1
);
-- 放行并标注:不拦截,但把质量标记写进数据
SELECT o.*, CASE WHEN o.amount IS NULL THEN 'amount_missing' ELSE 'ok' END AS dq_flag
FROM stage_orders o;
-- 降级:用前一日分区兜底,并在产出表上标注口径
INSERT OVERWRITE TABLE ads_report_1d PARTITION (dt='2026-10-11')
SELECT *, 'degraded_from_2026-10-10' AS data_note FROM ads_report_1d WHERE dt='2026-10-10';四种策略对照
| 策略 | 主流程 | 下游可见性 | 适用字段 | 代价 |
|---|---|---|---|---|
| 拦截 | 中断 | 下游不产出 | 金额、主键 | 可能放大为停摆 |
| 隔离 | 继续 | 隔离表可查 | 枚举越界、格式异常 | 隔离表需有人处理 |
| 放行并标注 | 继续 | 质量标记随数据传递 | 附加字段、埋点 | 下游须自行判断 |
| 降级 | 继续 | 需公告口径 | 必须按期交付的报表 | 口径与昨日相同 |
放行必须留痕:没有质量标记的默默放行,下游往往在数周后才发现口径问题,届时已经影响了多份报表。
一刀切拦截会把小问题放大成下游停摆:先确认错误比例与字段重要性,再决定拦截还是隔离。
隔离表要有消费方与清理规则:长期没人看的隔离表只会持续增长,既占存储也让人以为问题已被处理。