Great Expectations(简称 GX)是开源数据质量验证框架,核心思路是把「数据应该长什么样」声明为 Expectation(期望),再对 Pandas、Spark、SQL 等数据源执行批量验证,并自动生成可分享的 HTML 数据文档(Data Docs)。它解决的核心问题是:数据管线中散落各处的临时校验脚本不可复用、不可追溯、不可审计,质量问题往往到建模或上线阶段才暴露。GX 将质量规则集中管理、版本化、可调度,让数据团队在接入、清洗、建模、上线每个环节都用同一套「质量契约」把关。本篇按「速览 → 安装 → 上手 → 核心能力 → 生产部署 → 选型 → 场景 → 误区 → 面试题」组织,读完即可把 GX 1.x 接入项目。
掌握 GX 意味着你具备工程化数据质量治理的落地能力——这是 AI/数据团队从「调模型」走向「管数据」的关键技能。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Great Expectations:质量规则散落 → 声明式契约集中治理
数据质量事故往往在管线深处爆发:ETL 空值没有拦截、金额出现负数、主键重复导致下游 join 膨胀。多数团队用临时脚本 if not df.isnull().any() 或分散在各环节的断言来拦截,但这些检查不可复用、没有文档、没有历史版本,换一个数据源就要重写。等到模型训练或报表上线才发现脏数据,溯源成本极高。
GX 把质量规则定义为声明的「期望」(Expectation),例如「字段 X 不为空」「金额在 0–100000 之间」;一组期望打包成 Expectation Suite,相当于数据集的质量契约。通过 Checkpoint 把数据源、套件、报告动作绑定,批量数据进入时统一校验,输出结构化结果并自动渲染 Data Docs 报告。规则可以跨 Pandas、Spark、SQL 复用,也能在 CI/CD 和调度系统中作为质量门禁,失败即阻断下游任务。
与 Soda 偏重监控告警、dbt tests 与模型绑定、Pandera 内嵌 Python 运行时的定位不同,GX 强调「契约 + 报告 + 协作」:开发期用 Notebook 交互设计规则,生产期用 Checkpoint 执行,业务方通过 Data Docs 查看质量报表。这种模式适合质量规则需要长期演进、跨团队沉淀的场景。
安装与环境配置:3 步就绪
步骤一:安装。 建议在独立虚拟环境中安装,避免与既有依赖冲突。GX 1.x 的核心安装命令只有一个。
步骤二:配置。 首次调用 gx.get_context() 会自动初始化项目级的 Data Context 配置目录(存放数据源、套件、Checkpoint 定义)。连接 SQL 数据仓库需额外安装对应驱动,例如 PostgreSQL 需要 pip install sqlalchemy psycopg2-binary;使用 Spark 则需 pip install pyspark。
步骤三:验证。 打印版本号确认安装成功。
mkdir gx_demo && cd gx_demopython -m venv .venvsource .venv/bin/activate # Windows 使用 .venv\Scripts\activate pip install great_expectations python -c "import great_expectations as gx; print(gx.__version__)"
快速上手:10 分钟跑通第一个质量验证
最小可用流程的思路:构造一份含空值与负金额的订单示例数据,声明两条期望(order_id 不为空、金额在合法区间),执行验证并观察结论。整个流程不需要额外服务,本地 Python 即可跑通。
1. 在 gx_demo 目录新建 validate_demo.py,粘贴以下脚本。
2. 运行 python validate_demo.py。
3. 观察输出:本例中两条期望均失败(order_id 含空值、amount 含 -10.0),整体 success 为 False,这正是 GX 的拦截效果。
进阶技巧:验证结果对象的 results 列表中有每条期望的观测值(如空值数量 missing_count、超界行数),可用于告警日志或写入监控系统。生产环境应将套件定义与批量验证分离,套件在初始化阶段定义,调度阶段只执行验证。
# validate_demo.py — GX 1.x 最小验证示例import great_expectations as gximport pandas as pd df = pd.DataFrame({ "order_id": ["A001", "A002", "A003", None], "amount": [100.0, 250.5, -10.0, 88.0], "status": ["paid", "paid", "refunded", "paid"],}) context = gx.get_context()datasource = context.data_sources.add_pandas(name="orders_datasource")asset = datasource.add_dataframe_asset(name="orders_asset")batch = asset.get_batch(dataframe=df) suite = context.suites.add(gx.ExpectationSuite(name="orders_suite"))suite.add_expectation( gx.expectations.ExpectColumnValuesToNotBeNull(column="order_id"))suite.add_expectation( gx.expectations.ExpectColumnValuesToBeBetween( column="amount", min_value=0, max_value=100000 )) result = batch.validate(suite)print("验证通过:", result.success)for r in result.results: print(r.expectation_config.expectation_type, "->", r.success)
核心能力详解:5 大支柱
支柱一:声明式期望体系。 Expectation 是 GX 的最小质量规则单元,内置 100+ 种期望,覆盖单列值(非空、唯一、范围、枚举)、跨列关系、表级统计(行数、均值)等。规则用 Python 声明,不写 SQL 或自定义断言,天然可读、可复用。
支柱二:Expectation Suite。 一组期望的有序集合,相当于数据集的质量契约。多人口径一致:数据团队定义规则,业务方审阅规则,后续所有验证共用同一套契约,避免「生产验收一套、临时检查一套」。
支柱三:多数据源支持。 通过 Data Source / Data Asset 抽象,同一套 Expectation 可作用于 Pandas DataFrame、Spark DataFrame 以及 PostgreSQL、MySQL、BigQuery、Snowflake 等 SQLAlchemy 数据源。规则不绑定底层引擎,迁移数据栈时质量契约无需重写。
支柱四:Checkpoint。 把数据源、数据资产、期望套件与验证后的动作绑定成可执行工作流。Checkpoint 可在 Airflow、Prefect、cron 中被反复调用,每次运行产出结构化结果,失败时可通过退出码或异常阻断下游任务,是把 GX 从「Notebook 演示」推向「生产门禁」的关键组件。
支柱五:Data Docs。 自动渲染的 HTML 质量报告,展示每条期望的通过状态、观测值和可视化分布。报告可分享给非技术同事,也可以在 CI 或调度任务结束后归档,形成可追溯的质量审计记录。
生产部署与监控:从上线到运维
部署方式一:调度脚本 + Airflow/Prefect/cron。 在初始化阶段一次性定义数据源、资产与套件并落盘到 Data Context 配置目录;调度阶段执行独立 Python 脚本,读取已定义的资产、获取当日数据、运行验证、按失败抛出异常。以 Airflow 为例,将上述脚本封装为 PythonOperator,失败即标记任务失败并阻断下游依赖。
部署方式二:GX Cloud 托管。 商业托管版提供云端 Data Context、套件管理与 Data Docs 托管,无需自建文档服务或存储验证历史。适合多团队共享质量规则、需要统一审计平台的场景;开源版功能完整,可作为选型起点,后续按需迁移。
可观测性。 GX 本身不提供监控面板,验证结果以 ExpectationSuiteValidationResult 结构化输出,含整体 success 与逐条期望的成功状态、观测值。实践中把结果 JSON 写入数仓或日志系统,再对接 Grafana/Prometheus 告警;Data Docs 作为人工复盘入口。CI 场景下以进程退出码作为质量门禁信号。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>坑 1:把 GX 装进全局 Python 环境,依赖冲突后排查困难;始终用虚拟环境。</li><li>坑 2:混用 0.x 与 1.x API(create_expectation_suite、run_validation_operator 等老调用),报错难以定位;新项目以官方 1.x 文档为准。</li><li>坑 3:只记录 success 布尔值,缺失失败明细;应同时记录每条期望的成功状态和观测值,便于问题回溯。</li><li>坑 4:每次调度都重新 add 同名数据源或套件,触发重名报错;生产环境用初始化脚本一次性定义,调度阶段只读取与验证。</li></ul>
| 维度 | Great Expectations | Soda Core | dbt tests | Pandera |
|---|---|---|---|---|
| 定位 | 声明式期望驱动的数据质量验证框架 | 基于 YAML 的轻量数据质量监控 | dbt 模型内嵌测试机制 | DataFrame 运行时校验库 |
| 编排范式 | Data Context + Checkpoint 对象模型 | CLI 命令 + 定时调度 | dbt 模型依赖图内声明 | Python 代码内嵌执行 |
| 类型约束 | Expectation Suite(100+ 期望类型) | SQL 检查 + YAML 断言 | YAML 声明 + SQL 自定义测试 | DataFrameSchema 数据类校验 |
| 学习曲线 | 中高(概念较多,API 重构过) | 低(YAML 简单直接) | 低(熟悉 dbt 后零成本) | 中(需理解 Schema 体系) |
| 生态集成 | Airflow、Prefect、Jupyter、GX Cloud | dbt、Airflow、K8s、Soda Cloud | dbt 生态原生(与模型同生命周期) | Pandas/Polars 数据处理栈 |
| 生产部署 | Checkpoint 脚本 + 调度器/托管云 | CLI 入 CI 或 cron,结果送云 | dbt run/test 一体化执行 | 打包进 Python 应用或流水线 |
| License | Apache 2.0 | Apache 2.0 | Apache 2.0 | MIT |
| 适合谁 | 需要跨数据源契约和可视化报告的团队 | 想快速给关键表加监控的中小团队 | 已用 dbt 管理整个数仓管线的团队 | 数据科学家做本地 DataFrame 校验 |
选型建议:已在用 dbt 管理数仓模型,优先选 dbt tests,零额外工具;需要跨 Pandas/Spark/SQL 的通用质量契约、自动报告与团队审阅流程,选 GX;只想快速给关键表和数仓加告警监控,Soda Core 更轻;数据科学家想在 Python 应用内部做 DataFrame 强类型校验,Pandera 最顺手。
版本迭代
GX 从 0.x 系列走向 1.x 的主线是「API 简化与稳定」。0.x 时代围绕配置文件与 CLI,接口频繁演变;1.x 于 2024 年转为 Python-First 对象模型,以 context/data source/suite/batch 为核心,明确稳定 API。(截至训练数据 2024 年中,可能已有更新版本)
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 0.16.x | 2022 | 数据源架构重构 | 引入 Data Source / Data Connector 分层,降低多后端接入成本 |
| 0.18.x | 2023 | 云端与文档体验 | GX Cloud 开放试用,Data Docs 渲染与可读性增强 |
| 1.0.0 | 2024-01 | Python-First API 正式版 | 对象模型全面重构,提供 get_context、data_sources、suites、batch.validate 新 API |
| 1.3.x | 2024 | 核心稳定性与云集成 | 针对 1.0 的社区反馈修复问题,扩展数据源支持与 GX Cloud 集成 |
GX 没有类似 ML 基准的统一公开评分,版本间差异主要体现在 API 结构与稳定性实测。从 0.x 到 1.x,验证调用从「ValidationOperator + 命令行」变为直接 batch.validate(suite),自定义 Expectation 更简单,验证吞吐也有改善。新项目直接用 1.x;存量 0.x 项目迁移时需把老调用逐一改写为新的对象模型,不建议混合使用。
AI 应用场景
RAG 知识库入库质量把关
阶段:数据接入与检索准备阶段
解决的问题:RAG 质量高度依赖入库语料。文档切片后的空文本、重复 chunk、元数据缺失会直接污染向量库。传统方式在各脚本里零散做 if 判断,无统一记录。GX 在切片写入向量库前用期望套件校验 content 非空、chunk_id 唯一、chunk 字符数在设定区间,失败则阻断入库。
具体案例:某文档问答项目对 120 万条切片运行 8 条期望,拦截 6.3% 空 content、2.1% 重复 chunk;过滤后线上检索 hit@5 提升约 12%,向量化调用成本下降约 8%。
Agent 工具输出结构校验
阶段:Agent 编排中的工具返回校验
解决的问题:LLM 调用工具后输出偶发缺字段、类型异常,直接传给下游函数会抛错。GX 把工具输出包装成 DataFrame 后,用非空、类型、枚举值期望做统一校验,替代散落的 isinstance 判断。
具体案例:多工具 Agent 平台对每趟会话的工具返回运行 5 条期望,下游解析报错从周均 3 次降到接近 0;问题定位时间从小时级降到分钟级。
ML 特征管道上线前基线确认
阶段:特征工程与模型上线前检查
解决的问题:特征表全列缺失、值域异常会在训练或推理时暴露,且难以溯源。GX 在特征任务完成后立刻验证均值、最值、非空率等基线期望,先于漂移检测发现工程性故障。
具体案例:推荐系统特征平台在每日特征产出后执行 15 条基线期望,故障发现时间从「训练启动后」提前到「特征生成后」;单次事故平均缩短排查工时约 4 小时。
常见误区
误区网上教程写的是 context.create_expectation_suite()、run_validation_operator(),我照抄到新版却一直报错,是不是安装有问题?
正解GX 在 2024 年进入 1.x,API 全面重构。1.x 以 context.data_sources、context.suites、batch.validate() 为核心,旧的 create_expectation_suite、ValidationOperator 等调用大多已废弃或改名。新项目直接看官方文档的 1.x 入门,不要照搬 2023 年之前的教程。
为何常见:搜索引擎首页多是 0.x 时代的高赞教程,初学阶段难以分辨版本差异。
误区我配好数据源,GX 会自动把缺失值、重复记录、异常值全部找出来并校验。
正解GX 不会自动分析数据。每条质量规则都必须显式声明为 Expectation,或用 Data Assistant(数据助手)基于样本自动生成「候选期望」后再人工确认。未声明为期望的字段即使有脏数据也不会报失败。
为何常见:产品强调「自动化验证」,容易把「自动执行与报告」误解为「自动发现规则」,实际规则设计仍依赖人来完成。
误区校验失败后 GX 会把空值补上、把重复行删掉,数据自己就干净了。
正解GX 只做验证与报告,绝不修改底层数据。修复逻辑必须自行实现(清洗脚本、转换任务、人工介入)。GX 的价值是指出「哪里脏、有多脏」,而不是替你清洗。
为何常见:很多数据工具(如 dbt 的测试伴随模型刷新)会让人误以为验证框架同时具备修复能力。
误区结果里 success 是 True 就够了,其他字段没必要看。
正解success 只是整体结论。生产上需要知道哪条期望失败、受影响行数和观测值,这些在结果对象的 results 明细和 Data Docs 报告里。只记录布尔值会让问题回溯无从下手。
为何常见:最小示例通常只打印 success,掩盖了明细字段对排障和审计的实际价值。
面试题
Q1. GX 中用于声明数据质量规则的核心对象是?
- A.Expectation 规则对象← 正确答案
- B.Model 模型对象
- C.Metric 指标对象
- D.Feature 特征对象
答案:A。Expectation 是 GX 的质量规则单元,声明「某列应满足什么条件」;Suite 是期望的集合而非单条规则;Metric 是验证时计算的观测值;Model 与 GX 无关。
Q2. 下面哪条命令能正确安装 GX 1.x?
- A.pip install great-expectation
- B.pip install great_expectations← 正确答案
- C.pip install great-experiences
- D.pip install gx-quality-framework
答案:B。官方包名是 great_expectations(下划线连接);A 少了复数 s、C 是拼写错误构造的包名、D 并不存在,安装后均无法 import great_expectations。
Q3. GX 1.x 中 Data Context 的核心职责包括哪些?
- A.管理数据源与数据资产← 正确答案
- B.维护与版本化期望套件← 正确答案
- C.直接训练机器学习模型
- D.运行 Checkpoint 并输出结果← 正确答案
答案:ABD。Data Context 在 1.x 中统一管理数据源(data_sources)、期望套件(suites)和 Checkpoint(checkpoints),并提供验证入口;训练模型不在其职责范围内。
Q4. GX 1.x 中,把 pandas DataFrame 变成可验证数据资产的做法是?
- A.add_pandas 与 add_dataframe_asset 组合← 正确答案
- B.create_dataframe_schema 单独一步
- C.gx_load_dataframe 单独函数调用
- D.register_pandas_dataframe 单独调用
答案:A。GX 1.x 的流程是 context.data_sources.add_pandas(name=...) 建立数据源,再 datasource.add_dataframe_asset(name=...) 声明资产,最后 asset.get_batch(dataframe=df) 包装数据;其余选项不是 GX 的 API 命名。
Q5. 相比裸 Python assert,GX 的核心价值有哪些?
- A.自动生成 HTML 数据文档报告← 正确答案
- B.期望套件集中管理与版本化← 正确答案
- C.自动修复检测到的数据问题
- D.同一套期望跨 pandas/Spark/SQL 复用← 正确答案
答案:ABD。GX 的价值在于规则沉淀(Suite)、可视化报告(Data Docs)与跨数据源复用;它只验证不修改数据,C 错误。
Q6. Great Expectations 采用的开源协议允许什么?
- A.可商用与再分发,需保留版权声明← 正确答案
- B.仅限个人学习与科研用途
- C.禁止修改与二次发布
- D.仅限非盈利组织个人使用
答案:A。GX 采用 Apache 2.0,允许商用、修改、再分发,前提是保留版权与许可声明;B、C、D 描述的限制与 Apache 2.0 不符。
Q7. GX 1.x 中调用 batch.validate(suite) 返回的结果对象类型是?
- A.ExpectationSuiteValidationResult 对象← 正确答案
- B.DataQualityValidationReport 对象
- C.BatchValidationReport 对象
- D.MetricComputationReport 对象
答案:A。验证返回 ExpectationSuiteValidationResult,包含整体 success 属性与逐条结果的 results 列表;其余选项不是 GX 的返回类型。
Q8. 将 GX 验证接入生产调度的常见方式有哪些?
- A.Airflow 中 PythonOperator 调用← 正确答案
- B.Prefect 中自定义 task 封装← 正确答案
- C.人工打开 Notebook 逐个执行
- D.cron 定时运行验证脚本← 正确答案
答案:ABD。生产调度通常把验证脚本封装为 Airflow/Prefect 任务或由 cron 定时执行,用退出码或异常标记失败;手动在 Notebook 中执行不属于生产调度方式。
Q9. 以下哪个 Expectation 用于断言某列不存在空值?
- A.ExpectColumnValuesToNotBeNull← 正确答案
- B.ExpectColumnValuesToBeUnique
- C.ExpectColumnValuesToBeBetween
- D.ExpectColumnMeanToBeBetween
答案:A。ExpectColumnValuesToNotBeNull 断言列值不允许为空;Unique 检查唯一性、Between 检查值域范围、Mean 检查均值区间,功能各不相同。
Q10. 关于 GX 数据源与验证行为的正确说法是?
- A.支持 Pandas 与 Spark 等多种数据源← 正确答案
- B.验证失败时自动回滚源数据变更
- C.Data Docs 报告可自动生成← 正确答案
- D.Expectation Suite 是一组期望的集合← 正确答案
答案:ACD。GX 通过抽象层支持 Pandas、Spark、SQL 等数据源;Data Docs 可自动渲染;Suite 确为期望集合。B 错误:GX 只验证不修改,也不会回滚任何源数据。