Great Expectations 5分钟上手:从安装到首次数据验证
引言:数据验证的痛点与解决方案
你是否曾因数据质量问题导致模型训练失败?还在手动编写冗长的检查脚本?Great Expectations(数据期望)作为开源数据验证框架,可让你用声明式语法定义数据规则,自动生成测试报告,5分钟内即可完成从安装到首次验证的全流程。
读完本文你将掌握:
- 快速安装Great Expectations的3种方法
- 初始化项目并创建数据上下文(Data Context)
- 定义首个数据期望(Expectation)
- 执行数据验证并解读可视化报告
- 集成验证流程到现有工作流的最佳实践
1. 环境准备与安装(60秒)
1.1 系统要求
- Python 3.8-3.11
- pip 21.0+
- 虚拟环境(推荐)
1.2 快速安装
# 创建并激活虚拟环境
python -m venv gx_env
source gx_env/bin/activate # Linux/Mac
gx_env\Scripts\activate # Windows
# 基础安装
pip install great-expectations
# 带常用数据源支持的完整安装
pip install "great-expectations[spark,sqlalchemy,pandas]"
⚠️ 注意:不同数据源需安装对应依赖,如PostgreSQL需额外安装
psycopg2-binary,Snowflake需安装snowflake-connector-python
2. 初始化项目(90秒)
2.1 创建数据上下文
数据上下文(Data Context)是GX的核心对象,管理配置、期望套件和验证结果。通过以下代码初始化:
import great_expectations as gx
from great_expectations.data_context import FileDataContext
# 创建本地文件型数据上下文
context = FileDataContext.create(project_root_dir="./gx_project")
执行后将生成标准项目结构:
gx_project/
├── great_expectations.yml # 主配置文件
├── expectations/ # 期望套件存储
├── validations/ # 验证结果存储
├── data_docs/ # 数据文档(自动生成)
└── checkpoints/ # 检查点配置
2.2 连接数据源
以CSV文件为例,注册数据源(Datasource):
# 定义数据源配置
datasource_config = {
"name": "taxi_data",
"class_name": "Datasource",
"execution_engine": {
"class_name": "PandasExecutionEngine"
},
"data_connectors": {
"default_inferred_data_connector_name": {
"class_name": "InferredAssetFilesystemDataConnector",
"base_directory": "./data", # 数据文件存放目录
"default_regex": {
"pattern": "(.*)\\.csv",
"group_names": ["data_asset_name"]
}
}
}
}
# 将数据源添加到上下文
context.add_datasource(**datasource_config)
3. 定义数据期望(120秒)
3.1 创建期望套件
期望套件(Expectation Suite)是数据规则的集合,可通过交互式方式创建:
# 加载数据资产(Data Asset)
batch_request = context.get_batch_request(
datasource_name="taxi_data",
data_connector_name="default_inferred_data_connector_name",
data_asset_name="yellow_tripdata", # CSV文件名(不含.csv)
)
# 创建新的期望套件
expectation_suite_name = "taxi_data_suite"
context.create_expectation_suite(
expectation_suite_name=expectation_suite_name,
overwrite_existing=True
)
# 启动交互式创建器
validator = context.get_validator(
batch_request=batch_request,
expectation_suite_name=expectation_suite_name
)
3.2 添加核心期望
通过Validator对象定义数据规则:
# 1. 检查列存在性
validator.expect_table_columns_to_match_ordered_list(
column_list=["passenger_count", "trip_distance", "fare_amount"]
)
# 2. 数值范围验证
validator.expect_column_values_to_be_between(
column="passenger_count",
min_value=1,
max_value=6,
mostly=0.95 # 允许5%的异常值
)
# 3. 非空验证
validator.expect_column_values_to_not_be_null(
column="fare_amount"
)
# 4. 数据类型检查
validator.expect_column_values_to_be_of_type(
column="trip_distance",
type_="float64"
)
# 保存期望套件
validator.save_expectation_suite(discard_failed_expectations=False)
常用期望类型对比表:
| 期望类型 | 适用场景 | 示例 |
|---|---|---|
expect_table_* | 表级验证 | 行数检查、列名匹配 |
expect_column_* | 列级验证 | 非空检查、类型验证 |
expect_column_pair_* | 列间关系 | 价格>0且距离>0 |
expect_column_values_* | 值验证 | 枚举检查、正则匹配 |
4. 执行数据验证(60秒)
4.1 创建检查点
检查点(Checkpoint)定义验证执行流程,支持多种触发方式:
checkpoint_config = {
"name": "taxi_data_checkpoint",
"config_version": 1.0,
"class_name": "SimpleCheckpoint",
"expectation_suite_name": expectation_suite_name,
"batch_request": batch_request,
"action_list": [
{
"name": "store_validation_result",
"action": {"class_name": "StoreValidationResultAction"}
},
{
"name": "update_data_docs",
"action": {"class_name": "UpdateDataDocsAction"}
}
]
}
context.add_checkpoint(**checkpoint_config)
4.2 运行验证
# 执行验证
result = context.run_checkpoint(checkpoint_name="taxi_data_checkpoint")
# 检查验证结果
if result["success"]:
print("✅ 数据验证通过!")
else:
print("❌ 数据验证失败,请查看报告。")
5. 查看验证报告(30秒)
5.1 生成数据文档
# 手动生成HTML报告
context.build_data_docs()
# 自动打开报告(需本地浏览器支持)
context.open_data_docs()
5.2 报告解读要点
生成的报告包含:
- 总体通过率仪表盘
- 每个期望的详细结果
- 失败案例的采样数据
- 数据统计信息与直方图

⚠️ 注意:实际部署时可配置报告存储位置(S3/GCS/本地),并设置邮件/Slack通知。
6. 工作流集成与自动化
6.1 命令行执行
# 创建检查点配置文件
great_expectations checkpoint new taxi_checkpoint
# 运行检查点
great_expectations checkpoint run taxi_checkpoint
6.2 调度集成示例(Airflow)
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime
default_args = {
"owner": "data_team",
"start_date": datetime(2023, 1, 1)
}
with DAG(
"taxi_data_validation",
default_args=default_args,
schedule_interval="@daily"
) as dag:
validate_task = BashOperator(
task_id="validate_taxi_data",
bash_command="""
source /path/to/gx_env/bin/activate &&
cd /path/to/gx_project &&
great_expectations checkpoint run taxi_data_checkpoint
"""
)
7. 常见问题与解决方案
7.1 安装问题
| 错误 | 解决方案 |
|---|---|
No module named 'great_expectations' | 确认虚拟环境激活,重新安装 |
ImportError: Pandas requires version... | 安装兼容版本:pip install pandas==1.5.3 |
Permission denied | 使用虚拟环境或--user标志 |
7.2 数据源连接
# PostgreSQL示例
datasource_config = {
"name": "postgres_db",
"class_name": "Datasource",
"execution_engine": {
"class_name": "SqlAlchemyExecutionEngine",
"connection_string": "postgresql://user:password@host:port/dbname"
},
# ...
}
8. 总结与进阶
8.1 5分钟回顾
8.2 进阶路径
- 期望自动生成:使用Profiler自动推断数据规则
- 数据契约:与上下游系统共享期望套件
- CI/CD集成:在PR阶段自动执行数据验证
- 自定义期望:开发业务特定的数据规则
8.3 资源推荐
- 官方文档:docs.greatexpectations.io
- GitHub仓库:https://gitcode.com/GitHub_Trending/gr/great_expectations
- 社区支持:Slack频道 #great-expectations
如果你觉得本文有帮助,请点赞👍收藏🌟关注,下期将带来《Great Expectations高级特性:自定义期望开发指南》。
附录:完整代码示例
# 完整初始化脚本
import great_expectations as gx
from great_expectations.data_context import FileDataContext
# 1. 创建数据上下文
context = FileDataContext.create(project_root_dir="./gx_project")
# 2. 配置数据源
datasource_config = {
"name": "taxi_data",
"class_name": "Datasource",
"execution_engine": {"class_name": "PandasExecutionEngine"},
"data_connectors": {
"default_inferred_data_connector_name": {
"class_name": "InferredAssetFilesystemDataConnector",
"base_directory": "./data",
"default_regex": {"pattern": "(.*)\\.csv", "group_names": ["data_asset_name"]}
}
}
}
context.add_datasource(**datasource_config)
# 3. 创建期望套件
batch_request = context.get_batch_request(
datasource_name="taxi_data",
data_connector_name="default_inferred_data_connector_name",
data_asset_name="yellow_tripdata"
)
context.create_expectation_suite("taxi_data_suite", overwrite_existing=True)
validator = context.get_validator(batch_request=batch_request, expectation_suite_name="taxi_data_suite")
# 4. 定义期望
validator.expect_table_columns_to_match_ordered_list(
column_list=["passenger_count", "trip_distance", "fare_amount"]
)
validator.expect_column_values_to_be_between("passenger_count", 1, 6, mostly=0.95)
validator.save_expectation_suite()
# 5. 执行验证
context.add_checkpoint(
name="taxi_checkpoint",
config_version=1.0,
class_name="SimpleCheckpoint",
expectation_suite_name="taxi_data_suite",
batch_request=batch_request
)
context.run_checkpoint(checkpoint_name="taxi_checkpoint")
context.build_data_docs()
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



