首页/数据/数据工程与 ETL 速查/Amazon Deequ 数据质量库

Amazon Deequ 数据质量库

Deequ 是构建在 Spark 之上的数据质量库:对 DataFrame 定义约束(完整性、唯一性、合规性等),一次扫描计算多项指标,支持结果导出与约束建议;适合已有 Spark 链路的团队在写入前做批量校验。

Amazon Deequ 是什么

Deequ(awslabs/deequ,Scala 实现,Python 侧用 pydeequ)是构建在 Apache Spark 之上的数据质量库:对 DataFrame 定义一组约束(完整性、唯一性、合规性、数值范围等),由一次扫描统一计算相关指标,避免为每条规则重复扫表,最后输出可导出的验证结果。适合已有 Spark 链路、希望在写数前批量把关的团队;代价是它与 Spark 作业绑定,单次验证的资源消耗要单独评估。

基本信息

定位Spark 生态的数据质量约束与指标库
语言Scala(deequ)与 Python(pydeequ)
扫描方式一次扫描计算多项约束指标,降低反复扫表成本
结果可转成表格落库,接入稽核结果表与看板
适用已有 Spark 作业、需要在写数前批量把关的场景

典型使用场景

  • Spark 作业写出前校验:主键完整唯一、金额非负、行数在合理区间
  • 批量扫描多张表生成基础画像(列的空值率、唯一值数量)
  • 接入调度:把校验结果写回稽核表,纳入质量看板
  • 数据接入验收:新数据源第一次入湖时先跑一轮约束
  • 约束建议:用分析器给出候选约束,再人工筛选保留

pydeequ 校验骨架

pydeequ 校验骨架
from pydeequ.checks import Check, CheckLevel
from pydeequ.verification import VerificationSuite

# 注意:约束要挂在一次 VerificationSuite 上,避免多次扫表
result = (VerificationSuite(spark)
  .onData(df)
  .addCheck(Check(spark, CheckLevel.Error, "orders")
    .hasSize(lambda x: x >= 1000)          # 行数下限
    .isComplete("order_id")                 # 非空
    .isUnique("order_id")                   # 唯一
    .isNonNegative("amount"))               # 金额非负
  .run())

# 把结果转成 DataFrame 落库,供看板与复盘使用
from pydeequ.verification import VerificationResult
check_df = VerificationResult.checkResultsAsDataFrame(spark, result)

常用约束与适用列

约束检查内容适用列注意点
hasSize行数在区间内整表阈值按历史区间设
isComplete非空主键、关键字段空字符串也算缺失需另处理
isUnique取值唯一业务主键组合键需自行拼接后再判
isNonNegative非负金额、数量退款等负值场景不适用
isContainedIn落在集合内状态、渠道集合变更需同步维护
约束阈值要结合历史基线设定:全部设成零容忍会让正常业务波动也触发失败,最终导致校验结果被忽略。
把 Deequ 当独立巡检直接跑全表时,大表一次验证的扫描开销要单独评估,最好限定到当日分区或抽样。
阈值全部写死在代码里时,业务波动只能改代码重新发布;把阈值抽到配置文件或参数表中,调整成本会低很多。

易错点

  • 把 Deequ 当独立巡检跑全表,大表一次验证的扫描成本要单独评估,容易挤占产出窗口
  • 阈值全部写死在代码里,业务波动时只能改代码重新发布,规则形同虚设
  • 只校验不落库,通过率与失败样例无法追踪,复盘时没有依据
  • 约束定义与业务口径不一致(把测试单、冲正单算进去),指标天然偏差

数据来源与参考

  • Amazon Deequ 官方文档(awslabs/deequ)
  • pydeequ 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌