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 当独立巡检直接跑全表时,大表一次验证的扫描开销要单独评估,最好限定到当日分区或抽样。
阈值全部写死在代码里时,业务波动只能改代码重新发布;把阈值抽到配置文件或参数表中,调整成本会低很多。