首页/数据/数据工程与 ETL 速查/隔离表(quarantine)设计

隔离表(quarantine)设计

隔离表集中存放校验失败的行:原始字段、失败规则、失败时间、来源分区,供人工修复与重放;按天分区、设保留策略,并配“隔离量趋势”监控,隔离量突然升高通常意味着上游发生了变化。

隔离表是什么

隔离表(quarantine,也叫死信表)集中存放校验失败的行,把“坏数据”从主链路里摘出来,而不是让整个任务失败,也不是让脏数据悄悄混进去。典型字段有原始行内容、触发规则、来源分区与失败时间。下游消费前先看隔离量,人工或自动修复后再走幂等重放回主表。

基本信息

常见别名死信表、异常表、error table
核心字段原始行内容、触发规则、来源分区、失败时间
分区策略按天分区,配保留周期(如 30~90 天)
重放方式修复后按主键 upsert 回写,保证幂等
监控项隔离量趋势、环比突增、积压未处理条数

典型使用场景

  • 脏数据不阻塞主流程:坏行入隔离表,好行继续入库
  • 问题定位:按规则标识聚合,快速看出是哪条规则在批量失败
  • 人工修复与重放:修复后幂等回写,不影响已入库的数据
  • 上游变更预警:隔离量突然升高通常意味着上游结构或口径变了
  • 审计留痕:保留失败原始行,事后可追溯当时的输入

隔离表结构示例

隔离表结构示例
CREATE TABLE dw_quarantine.order_fail (
  order_id      BIGINT,       -- 业务主键,便于按主键回查与重放
  payload       STRING,       -- 原始行序列化内容(JSON 或分隔符文本)
  dq_rule       STRING,       -- 触发的规则标识
  src_partition STRING,       -- 来源分区
  fail_time     TIMESTAMP     -- 失败时间
) PARTITIONED BY (dt STRING);  -- 按天分区,便于设置保留策略

隔离量趋势

隔离量趋势
-- 隔离量趋势:与近 7 天比较,突增或出现新规则都应触发排查
SELECT dt,
       COUNT(*) AS quarantined,
       COUNT(DISTINCT dq_rule) AS rule_cnt
FROM dw_quarantine.order_fail
WHERE dt >= '2026-10-05'
GROUP BY dt
ORDER BY dt;

三种处置方式对照

处置适用场景注意点
直接丢弃确认是无效脏数据要留计数与样本,避免静默丢数
修复后重放字段可补全修复重放必须幂等,按主键 upsert
回退上游根因在上游产出先止损再修根因,不在稽核侧重算
修复后重放走幂等写入(按主键 upsert),避免修复数据与增量数据重复叠加。
隔离表要有清理策略:按天分区加保留周期或归档,只留下有追溯价值的最近一段时间,否则会无限膨胀。

易错点

  • 隔离表只写不读,越堆越大长期没人处理
  • 重放不做幂等,与已增量修正的数据重复
  • 隔离表不分区,按失败时间清理要走全表扫描,删除成本极高
  • 隔离量突增没有告警,上游结构变更后连续多天静默丢数

数据来源与参考

  • 行业数据质量治理实践(隔离表/死信区)
  • DAMA-DMBOK(数据质量管理)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌