Great Expectations数据质量与数据湖:原始数据验证
数据湖原始数据的质量痛点与解决方案
你是否还在为数据湖中杂乱无章的原始数据头疼?当数据从千差万别的源头流入数据湖(Data Lake),缺失值、格式错误、 schema 漂移等问题可能导致下游分析结果失真,甚至引发业务决策失误。根据 Gartner 2024 年报告,60% 的数据湖项目因数据质量问题未能实现预期价值。Great Expectations(GX) 作为开源数据质量工具,通过自动化数据验证(Data Validation)为数据湖构建第一道防线。本文将系统讲解如何利用 GX 对 S3、Azure Blob 等数据湖存储的原始数据进行验证,确保数据从接入阶段就符合预期。
读完本文你将掌握:
- 数据湖原始数据的 5 大质量风险及对应 GX 验证策略
- 基于 GX 的数据湖验证架构与工作流设计
- S3/Azure Blob 数据源配置与批量数据验证实现
- 10+ 高频原始数据 Expectation 示例(含正则匹配、类型检查等)
- 数据验证报告与 CI/CD 集成最佳实践
数据湖原始数据质量风险与 GX 应对策略
原始数据五大质量风险
| 风险类型 | 典型场景 | 影响程度 | GX 验证手段 |
|---|---|---|---|
| 缺失值 | 用户行为日志缺少 user_id | 高 | expect_column_values_to_not_be_null |
| 格式错误 | 日期字段混入非 ISO 格式字符串 | 高 | expect_column_values_to_match_regex |
| 数据类型异常 | 价格字段出现字符串类型 | 中 | expect_column_values_to_be_of_type |
| 数据量异常 | 日活数据量突降 90% | 高 | expect_table_row_count_to_be_between |
| Schema 漂移 | JSON 日志新增未声明字段 | 中 | expect_table_columns_to_match_ordered_list |
GX 数据湖验证工作流
环境准备与数据源配置
安装与初始化
# 克隆仓库
git clone https://gitcode.com/GitHub_Trending/gr/great_expectations.git
cd great_expectations
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
pip install boto3 azure-storage-blob # 数据湖依赖
# 初始化 GX 项目
great_expectations init
S3 数据源配置(great_expectations.yml)
datasources:
pandas_s3_datasource:
type: pandas_s3
bucket: my-raw-data-bucket
boto3_options:
aws_access_key_id: ${AWS_ACCESS_KEY_ID}
aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
region_name: cn-northwest-1
assets:
user_logs:
type: csv
batching_regex: .*user_events_(\d{8})\.csv
Azure Blob 数据源配置
from great_expectations.datasource.fluent.pandas_azure_blob_storage_datasource import PandasAzureBlobStorageDatasource
datasource = context.sources.add_or_update_pandas_azure_blob_storage(
name="azure_datasource",
account_name="myazureaccount",
container="raw-data",
sas_token="${AZURE_SAS_TOKEN}"
)
# 添加数据资产
datasource.add_csv_asset(
name="product_catalog",
prefix="products/",
delimiter="/",
recursive_file_discovery=True
)
核心 Expectation 实战示例
1. 基础完整性验证
场景:确保用户日志的 user_id 和 event_time 字段无缺失,且 event_time 符合 ISO 格式。
from great_expectations.expectations.core import ExpectColumnValuesToNotBeNull, ExpectColumnValuesToMatchRegex
# 创建 Expectation Suite
suite = context.add_expectation_suite("user_logs_suite")
# 添加验证规则
suite.add_expectation(
ExpectColumnValuesToNotBeNull(
column="user_id"
)
)
suite.add_expectation(
ExpectColumnValuesToMatchRegex(
column="event_time",
regex=r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$" # ISO 8601 格式
)
)
2. 数据类型与范围验证
场景:验证订单数据中 price 为数值类型且大于 0,quantity 为整数。
suite.add_expectation(
ExpectColumnValuesToBeOfType(
column="price",
type_="float64"
)
)
suite.add_expectation(
ExpectColumnValuesToBeBetween(
column="price",
min_value=0.01,
max_value=None
)
)
suite.add_expectation(
ExpectColumnValuesToBeInTypeList(
column="quantity",
type_list=["int64", "Int64"] # 支持 pandas nullable integer
)
)
3. 文件命名规范验证
场景:确保 S3 中的 CSV 文件符合 {table}_{YYYYMMDD}.csv 命名规范。
from great_expectations.expectations.core import ExpectFileNameToMatchRegex
suite.add_expectation(
ExpectFileNameToMatchRegex(
regex=r"^[a-z_]+_\d{8}\.csv$",
regex_group_names=["table_name", "date"]
)
)
批量验证与报告生成
创建 Checkpoint 配置(checkpoints/user_logs_checkpoint.yml)
name: user_logs_checkpoint
config_version: 1.0
class_name: Checkpoint
run_name_template: "%Y%m%d-%H%M%S-user-logs-validation"
validations:
- batch_request:
datasource_name: pandas_s3_datasource
data_asset_name: user_logs
batch_slice:
end: 10000 # 验证前 10000 行
expectation_suite_name: user_logs_suite
action_list:
- name: store_validation_result
action:
class_name: StoreValidationResultAction
- name: update_data_docs
action:
class_name: UpdateDataDocsAction
执行验证与查看报告
# 运行 Checkpoint
great_expectations checkpoint run user_logs_checkpoint
# 打开 Data Docs
great_expectations docs open
Data Docs 报告示例:
- 验证成功率:98.7%
- 失败项:3 条
event_time格式错误,2 条price为负数 - 详细日志:
uncommitted/data_docs/local_site/index.html
高级应用:数据湖验证 CI/CD 集成
GitHub Actions 配置(.github/workflows/data_validation.yml)
name: 数据湖原始数据验证
on:
schedule:
- cron: '0 1 * * *' # 每日凌晨 1 点执行
workflow_dispatch: # 手动触发
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 设置 Python
uses: actions/setup-python@v5
with:
python-version: "3.9"
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install boto3
- name: 配置 AWS 凭证
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: cn-northwest-1
- name: 执行 GX 验证
run: great_expectations checkpoint run user_logs_checkpoint
- name: 上传报告
uses: actions/upload-artifact@v3
with:
name: data-docs
path: uncommitted/data_docs/
常见问题与性能优化
1. 大规模数据验证策略
- 抽样验证:通过
batch_slice验证部分数据(如前 10%) - 分区验证:按时间分区(如每日数据)增量验证
- 并行执行:配置 Spark 数据源利用分布式计算
# 抽样验证示例
batch_request = {
"datasource_name": "spark_s3_datasource",
"data_asset_name": "large_dataset",
"batch_slice": {
"sampling_method": "random",
"sampling_kwargs": {"frac": 0.1} # 随机抽取 10%
}
}
2. 敏感数据处理
- 使用
config_variables.yml存储凭证,避免硬编码 - 验证报告脱敏:过滤手机号、身份证号等字段
# config_variables.yml
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
3. 数据湖特定问题处理
| 问题 | 解决方案 |
|---|---|
| 文件路径嵌套过深 | 使用 recursive_file_discovery: true |
| 小文件数量过多 | 合并文件后验证(如 Spark coalesce(1)) |
| 跨区域访问延迟 | 配置 boto3_options 中的 region_name |
总结与展望
本文详细介绍了如何基于 Great Expectations 构建数据湖原始数据验证体系,包括:
- 数据湖质量风险分析与 GX 应对策略
- S3/Azure 数据源配置与环境搭建
- 10+ 核心 Expectation 实战示例
- 批量验证与 CI/CD 集成方案
后续演进方向:
- 结合数据血缘工具(如 Apache Atlas)实现端到端质量追踪
- 利用 GX Profiler 自动生成 Expectation 规则
- 构建数据质量评分卡,量化数据健康度
通过 GX 的原始数据验证,可将数据质量问题拦截在数据湖入口,为下游数据仓库、BI 报表和机器学习模型提供可靠的数据基础。立即开始你的数据质量之旅吧!
收藏本文,关注作者获取《Great Expectations 高级特性:自定义 Expectation 开发》下一期内容!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



