Great Expectations、Deequ、DataWorks DQC——三大DQC工具到底怎么选?
本文目录
先说结论
Great Expectations:Python生态、最灵活、社区活跃,适合数据科学/分析师团队,BI侧管控为主。
Deequ:AWS出品、基于Spark、性能最强,适合大数据量、Spark/Databricks技术栈的团队。
DataWorks DQC:阿里云内置、零开发成本、和调度深度集成,适合阿里云生态、追求开箱即用的团队。
一句话总结:看技术栈,不看工具流行度。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
这道题在中高级数据开发的面试里出现频率越来越高。考的不是某个工具的细节,而是你的「选型思维」——你能不能根据团队规模、技术栈、成熟度,给出合理的工具选择。我在出海硬件公司用过Deequ(Spark生态)和自研框架,在当前出海短剧公司用DataWorks DQC,三种都踩过坑,今天给你一个真实的选型框架。
三大工具核心架构对比
| 维度 | Great Expectations | Deequ | DataWorks DQC |
|---|---|---|---|
| 语言/平台 | Python | Scala/Spark | 云平台SaaS(无代码配置) |
| 执行引擎 | Pandas/Spark/SQL | Spark原生 | MaxCompute/Hologres |
| 规则定义 | Expectation Suite(JSON) | Constraint API(代码) | 可视化配置/SQL |
| 性能 | 中等(Spark后端较慢) | 极强(增量计算+列存) | 强(原生引擎,配额限制) |
| 与调度集成 | 需自己接Airflow/DolphinScheduler | 需自己写代码触发 | 和DataWorks调度无缝 |
| 适合规模 | 百表以内/中小团队 | 千表以上/大数据量 | 阿里云生态任意规模 |
| 上手成本 | 中(需Python基础) | 高(需Spark/Scala) | 低(界面操作) |
| 数据剖析 | 强(Profiler内置) | 强(Profile模块) | 弱(需手写SQL) |
Great Expectations实战代码示例
GE的核心概念是Expectation Suite——一组对数据的「期望」。它最大的优点是规则即文档,每个Expectation都自带含义说明:
import great_expectations as ge
# 加载数据并创建Expectation Suite
df = ge.read_csv('orders.csv')
# 期望:order_id字段非空、唯一、且为整数
df.expect_column_values_to_not_be_null('order_id')
df.expect_column_values_to_be_unique('order_id')
df.expect_column_values_to_be_of_type('order_id', 'int64')
# 期望:amount字段在合理范围
df.expect_column_values_to_be_between('amount', 0, 1e8)
# 期望:status枚举值
df.expect_column_values_to_be_in_set('status', ['paid','refund','cancel'])
# 跨字段勾稽
df.expect_column_pair_values_A_to_be_greater_than_B('order_amount','discount_amount')
# 执行验证并自动生成HTML报告
results = df.validate()
优点:内置300+预定义Expectation、自动生成HTML数据质量报告、Profiler可一键扫描新表生成初版规则。
缺点:Spark Backend的性能比Deequ差不少;Python生态对纯Java/Scala团队不友好。
Deequ实战代码示例
Deequ是AWS Labs出的Scala库,最大优势是「为Spark而生」,10亿行的校验毫不费力。我在出海硬件公司Databricks集群上用Deequ处理过50亿行级别的事实表:
import com.amazon.deequ.VerificationSuite
import com.amazon.deequ.checks.{Check, CheckLevel}
val df = spark.read.parquet("s3://bucket/dwd_order/dt=20240315/")
val verificationResult = VerificationSuite()
.onData(df)
.addCheck(
Check(CheckLevel.Error, "订单表核心校验")
.hasSize(_ >= 1000000) // 数据量下限
.isComplete("order_id") // order_id 100% 非空
.isUnique("order_id") // 主键唯一
.isContainedIn("status", Array("paid","refund"))
.isNonNegative("amount")
.satisfies("amount <= 1e8", "金额合理范围")
).run()
// 失败的约束打印出来
verificationResult.checkResults.foreach { case (_, r) =>
r.constraintResults.filter(_.status != "Success")
.foreach(c => println(s"FAIL: ${c.constraint} - ${c.message}"))
}
Deequ还有一个核武器是增量计算(Incremental Metrics):每次只计算增量数据的指标,再合并到历史指标,对TB级数据非常友好。这点GE和DataWorks DQC都做不到。
DataWorks DQC的实战配置
DataWorks DQC是我在当前出海短剧公司的主力DQC工具。最大的好处是「零开发成本」——业务/数据分析师都可以自己配规则,不用找数据开发:
-- DataWorks DQC支持两种配置方式:
-- 1. 模板规则(界面勾选,零代码)
-- 例如:表行数波动、字段空值率、唯一性、枚举值
-- 2. 自定义SQL规则(适合勾稽校验)
-- 配置界面填入下面SQL,并设置告警条件
SELECT
SUM(CASE WHEN ABS(order_amount - discount - paid) > 0.01 THEN 1 ELSE 0 END) AS bad_rows,
COUNT(*) AS total_rows
FROM ${dwd_order_payment} WHERE dt = '${bizdate}';
-- 强规则:bad_rows = 0 才通过,否则阻断下游
-- 弱规则:bad_rows / total_rows < 0.001 仅告警
强规则 vs 弱规则:DataWorks的精髓在这里。强规则不通过会自动阻断下游任务,弱规则只发告警不阻断。这个机制非常重要,能避免「告警满天飞但没人处理」。
我的真实选型决策树
| 你的情况 | 推荐工具 | 理由 |
|---|---|---|
| 阿里云全家桶 | DataWorks DQC | 原生集成、零运维、强弱规则机制成熟 |
| AWS+Databricks/Spark | Deequ | 性能最强、Spark原生、增量计算 |
| 多云/自建Hadoop | Great Expectations | 跨平台、社区活跃、生态最完整 |
| 数据量<1TB+小团队 | Great Expectations | 上手最快、报告最美 |
| 数据量>10TB+大团队 | Deequ或自研 | Spark原生才扛得住 |
| 业务/分析师为主 | DataWorks DQC或GE | 可视化配置、人人可用 |
面试高频追问
追问一:你们用XX工具,遇到过它的什么局限?
DataWorks DQC的局限:跨表勾稽支持弱(只能在单SQL里写)、规则版本管理差(改规则没有Git diff)、告警渠道单一(钉钉/邮件,不能直接推PagerDuty)。Deequ的局限:纯Scala API对Python团队门槛高、HTML报告需要自己做。GE的局限:Spark Backend性能差、Expectation Suite的JSON结构层级太深难维护。回答时要具体到「哪里卡过你」,比泛泛而谈深度强10倍。
追问二:自研DQC框架什么时候考虑?
三个信号:第一,数据量超出现成工具能力(10TB+/规则);第二,需要深度业务勾稽(横跨10+张表);第三,组织上需要把质量数据沉淀成资产(规则库、问题库、责任人体系)。我在出海硬件公司就做过半自研——Deequ负责执行,自己写了规则配置中心+告警分发+问题闭环平台。
追问三:DQC和监控告警系统是什么关系?
DQC负责「数据本身」的校验,监控告警系统(Prometheus、阿里云监控)负责「数据基础设施」的可观测性。两者是上下层关系:基础设施告警先于数据告警——任务都没跑,DQC自然报不了。生产实践里一定要把两者打通,比如DQC告警自动带上调度系统链接、Spark UI链接、上下游表血缘,缩短MTTR。
实战踩坑:从GE迁移到DataWorks DQC的那次代价
我刚到当前出海短剧公司时,团队前任技术负责人推过一套基于GE的DQC平台。结果团队成员大部分是阿里云背景的SQL Boy/Girl,Python脚本无人维护,规则越来越脏,半年后基本没人用。我做了次重大决策:把所有规则迁移到DataWorks DQC原生方案。
迁移过程中踩了几个坑:1)GE里的复杂Expectation(比如基于历史分布的)DataWorks不支持,得改写成自定义SQL;2)GE的报告页面是HTML,DataWorks是表格,老用户一开始不适应;3)规则数量从180条精简到95条——很多GE自动生成的规则其实是噪声。最终结果:值班同学告警量降低60%,规则维护成本降到原来的1/4。
教训:工具选型不是「哪个最先进」,而是「哪个团队能hold住」。匹配团队技术栈和能力的工具,永远比技术上最强的工具更可持续。
总结
三大DQC工具:GE灵活、Deequ性能强、DataWorks零成本集成。选型核心看技术栈、团队能力、数据规模。面试时给出选型决策树,再结合一个真实的迁移/选型故事,远比单纯介绍工具特性来得有说服力。
下一篇聊一个看似简单实则高频翻车的题:主键唯一性,光靠PRIMARY KEY真的够吗?ETL链路里去重的5种姿势全梳理一遍。
你们团队用的什么DQC工具?吐槽和好评都欢迎,评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长