You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks Delta Live Tables数据质量校验失败仍加载下游表求助

Delta Live Tables 数据质量校验控制下游加载/流水线失败的SQL实现

核心原理:利用Expectation的fail_on_error模式

DLT的Expectations默认采用allow_violations模式(仅记录违规、不阻断流程),要实现校验失败时终止流水线或阻止下游表加载,必须显式指定fail_on_error = true——一旦触发违反规则的情况,整个流水线会立即停止,下游依赖表自然不会执行加载操作。

复杂校验的SQL定义示例

1. 单字段主键唯一性校验

假设report_table的主键为report_id,要确保其全局唯一,SQL定义如下:

CREATE OR REFRESH LIVE TABLE report_table
TBLPROPERTIES (
  'quality' = 'silver'
)
AS SELECT
  report_id,
  customer_id,
  report_date,
  amount
FROM LIVE.raw_report
WHERE
  report_id IS NOT NULL
-- 定义主键唯一性校验,触发违规则终止流水线
CONSTRAINT report_id_unique EXPECT (COUNT(report_id) = COUNT(DISTINCT report_id)) ON VIOLATION FAIL ON ERROR;

2. 复合主键校验

如果采用report_id + customer_id作为复合主键,校验逻辑可调整为:

CREATE OR REFRESH LIVE TABLE report_table
TBLPROPERTIES (
  'quality' = 'silver'
)
AS SELECT
  report_id,
  customer_id,
  report_date,
  amount
FROM LIVE.raw_report
WHERE
  report_id IS NOT NULL AND customer_id IS NOT NULL
-- 复合主键唯一性校验,违规则终止流水线
CONSTRAINT composite_pk_unique EXPECT (COUNT(CONCAT(report_id, '|', customer_id)) = COUNT(DISTINCT CONCAT(report_id, '|', customer_id))) ON VIOLATION FAIL ON ERROR;

3. 多条件组合校验

同时校验主键唯一、金额非负、日期合法的场景:

CREATE OR REFRESH LIVE TABLE report_table
TBLPROPERTIES (
  'quality' = 'silver'
)
AS SELECT
  report_id,
  customer_id,
  report_date,
  amount
FROM LIVE.raw_report
WHERE
  report_id IS NOT NULL AND customer_id IS NOT NULL
-- 主键唯一校验
CONSTRAINT report_id_unique EXPECT (COUNT(report_id) = COUNT(DISTINCT report_id)) ON VIOLATION FAIL ON ERROR,
-- 金额非负校验
CONSTRAINT amount_non_negative EXPECT (amount >= 0) ON VIOLATION FAIL ON ERROR,
-- 日期合法性校验(不晚于当前日期)
CONSTRAINT valid_report_date EXPECT (report_date <= CURRENT_DATE()) ON VIOLATION FAIL ON ERROR;

关键注意事项

  • 触发逻辑:多个FAIL ON ERROR约束中只要有一个被触发,流水线会立即停止,所有下游节点(包括Customer_s表)都不会执行。
  • 性能优化:聚合类校验(如主键唯一的COUNT对比)会增加计算开销,大数据量场景下可结合分区或批次逻辑优化,比如仅校验当前批次数据:
    CONSTRAINT report_id_unique_current_batch EXPECT (
      COUNT(report_id) OVER (PARTITION BY batch_id) = COUNT(DISTINCT report_id) OVER (PARTITION BY batch_id)
    ) ON VIOLATION FAIL ON ERROR;
    
  • 流水线状态:触发fail_on_error后,DLT流水线会标记为失败,需修复数据或调整校验规则后重新运行。

内容的提问来源于stack exchange,提问作者motivated_penguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:43:30