数据质量是数据资产价值的基础,建立完善的数据质量治理体系是企业的必备能力。
本文系统介绍数据质量的核心概念、治理框架和实战案例,帮助你构建数据质量保障体系。
| 维度 | 说明 | 示例 |
|---|
| 完整性 | 数据是否完整 | 缺失字段、空值 |
| 准确性 | 数据是否正确 | 错误值、格式错误 |
| 一致性 | 数据是否一致 | 跨系统数据不一致 |
| 及时性 | 数据是否及时 | 数据延迟 |
| 唯一性 | 数据是否唯一 | 重复数据 |
数据质量问题类型:
1. 格式问题
├─ 日期格式不统一
├─ 手机号格式错误
└─ 地址格式不规范
2. 逻辑问题
├─ 年龄为负数
├─ 订单金额为0
└─ 时间戳不合理
3. 一致性问题
├─ 跨表数据不一致
├─ 主从数据不一致
└─ 系统间数据不一致
数据质量治理框架:
┌─────────────────────────────────────────────────────────────┐
│ 组织层 │
│ ├─ 数据治理委员会 │
│ ├─ 数据Owner │
│ └─ 数据管理员 │
├─────────────────────────────────────────────────────────────┤
│ 流程层 │
│ ├─ 质量规则定义 │
│ ├─ 质量检查执行 │
│ ├─ 问题发现处理 │
│ └─ 持续改进 │
├─────────────────────────────────────────────────────────────┤
│ 技术层 │
│ ├─ 质量检查工具 │
│ ├─ 监控告警 │
│ ├─ 问题修复 │
│ └─ 质量报告 │
└─────────────────────────────────────────────────────────────┘
-- 完整性规则
-- 检查非空字段
SELECT count(*) FROM orders WHERE order_id IS NULL;
-- 准确性规则
-- 检查金额范围
SELECT count(*) FROM orders WHERE amount < 0 OR amount > 1000000;
-- 一致性规则
-- 检查跨表一致性
SELECT a.user_id, a.balance, b.total_amount
FROM account a
JOIN (
SELECT user_id, sum(amount) as total_amount
FROM orders
GROUP BY user_id
) b ON a.user_id = b.user_id
WHERE a.balance != b.total_amount;
-- 唯一性规则
-- 检查重复数据
SELECT order_id, count(*) as cnt
FROM orders
GROUP BY order_id
HAVING cnt > 1;
# Great Expectations配置
import great_expectations as gx
# 创建数据上下文
context = gx.get_context()
# 定义期望
validator = context.sources.pandas_default.read_csv("orders.csv")
# 检查非空
validator.expect_column_values_to_not_be_null("order_id")
# 检查唯一性
validator.expect_column_values_to_be_unique("order_id")
# 检查值范围
validator.expect_column_values_to_be_between("amount", 0, 1000000)
# 检查格式
validator.expect_column_values_to_match_regex("phone", r"^1[3-9]\d{9}$")
// Griffin质量规则
{
"name": "order_quality_check",
"process.type": "batch",
"data.sources": [
{
"name": "orders",
"connector": {
"type": "file",
"config": {
"format": "csv",
"path": "/data/orders.csv"
}
}
}
],
"measure": [
{
"name": "completeness",
"type": "accuracy",
"rule": "order_id IS NOT NULL",
"metric": "accuracy"
}
]
}
| 指标 | 说明 | 阈值 |
|---|
| 完整性 | 非空率 | > 99% |
| 准确性 | 正确率 | > 99.9% |
| 一致性 | 一致率 | > 99% |
| 及时性 | 延迟时间 | < 5分钟 |
| 唯一性 | 去重率 | 100% |
// 质量监控服务
@Service
public class DataQualityMonitor {
@Autowired
private QualityChecker qualityChecker;
@Autowired
private AlertService alertService;
@Scheduled(cron = "0 */5 * * * ?")
public void checkDataQuality() {
// 检查数据质量
QualityReport report = qualityChecker.check();
// 发送告警
if (report.getCompleteness() < 0.99) {
alertService.sendAlert("数据完整性低于阈值", report);
}
if (report.getAccuracy() < 0.999) {
alertService.sendAlert("数据准确性低于阈值", report);
}
// 保存报告
saveReport(report);
}
}
-- 订单数据质量检查
-- 1. 完整性检查
SELECT
count(*) as total_orders,
count(order_id) as non_null_order_id,
count(user_id) as non_null_user_id,
count(amount) as non_null_amount
FROM orders;
-- 2. 准确性检查
SELECT count(*) as invalid_orders
FROM orders
WHERE amount < 0
OR amount > 1000000
OR order_time > now();
-- 3. 一致性检查
SELECT o.order_id, o.amount, p.payment_amount
FROM orders o
JOIN payments p ON o.order_id = p.order_id
WHERE o.amount != p.payment_amount;
-- 4. 唯一性检查
SELECT order_id, count(*) as cnt
FROM orders
GROUP BY order_id
HAVING cnt > 1;
-- 质量报告生成
CREATE TABLE data_quality_report (
report_date date,
table_name string,
completeness decimal(5,4),
accuracy decimal(5,4),
consistency decimal(5,4),
uniqueness decimal(5,4),
overall_score decimal(5,4)
);
-- 插入报告
INSERT INTO data_quality_report
SELECT
current_date as report_date,
'orders' as table_name,
-- 完整性
(count(order_id) / count(*)) as completeness,
-- 准确性
(count(*) - count(CASE WHEN amount < 0 THEN 1 END)) / count(*) as accuracy,
-- 唯一性
(count(*) - count(CASE WHEN duplicate > 1 THEN 1 END)) / count(*) as uniqueness,
-- 综合得分
(completeness + accuracy + uniqueness) / 3 as overall_score
FROM (
SELECT *,
count(*) OVER (PARTITION BY order_id) as duplicate
FROM orders
) t;
| 原则 | 说明 |
|---|
| 预防为主 | 在源头控制质量 |
| 自动化 | 自动检查和告警 |
| 可量化 | 用指标衡量质量 |
| 持续改进 | 不断优化规则 |
| 问题 | 原因 | 解决方案 |
|---|
| 质量规则不全 | 定义不完善 | 完善规则库 |
| 告警太多 | 阈值不合理 | 调整阈值 |
| 问题修复慢 | 流程不畅 | 优化流程 |