编排与治理

第19课:数据质量

数据工程实战课程 · 编排与治理阶段

📊 数据质量

数据质量是数据工程的生命线,高质量数据是可靠决策的前提。

🐍 Python实战:核心实战

# 数据质量框架
import random, time
from datetime import datetime
from collections import defaultdict
from dataclasses import dataclass

@dataclass
class QualityRule:
    name: str; field: str; rule_type: str; params: dict
    severity: str = 'error'  # error, warning, info

@dataclass
class QualityResult:
    rule_name: str; passed: bool; total: int; failed: int; details: str

class DataQualityEngine:
    def __init__(self):
        self.rules = []; self.results = []
    def add_rule(self, rule): self.rules.append(rule)
    def validate(self, records):
        self.results = []
        for rule in self.rules:
            total = len(records)
            failed = 0
            for r in records:
                val = r.get(rule.field)
                if rule.rule_type == 'not_null' and (val is None or val == ''): failed += 1
                elif rule.rule_type == 'unique':
                    vals = [r.get(rule.field) for r in records]
                    if vals.count(val) > 1: failed += 1
                elif rule.rule_type == 'range':
                    if isinstance(val,(int,float)) and (val < rule.params.get('min',float('-inf')) or val > rule.params.get('max',float('inf'))): failed += 1
                elif rule.rule_type == 'accepted_values':
                    if val not in rule.params.get('values',[]): failed += 1
                elif rule.rule_type == 'regex':
                    import re
                    if not re.match(rule.params.get('pattern','.*'), str(val)): failed += 1
                elif rule.rule_type == 'custom':
                    if not rule.params.get('fn', lambda x: True)(val): failed += 1
            passed = failed == 0
            self.results.append(QualityResult(rule.name, passed, total, failed,
                f"{failed}/{total} failed ({failed/total*100:.1f}%)" if total else "no records"))
        return self.results
    def quality_score(self):
        if not self.results: return 0
        weights = {'error': 1.0, 'warning': 0.5, 'info': 0.1}
        total_weight = sum(weights.get(r.severity, 1.0) for r in self.rules)
        passed_weight = sum(weights.get(r.severity, 1.0) for r, res in zip(self.rules, self.results) if res.passed)
        return round(passed_weight / total_weight * 100, 1) if total_weight else 0

# 生成测试数据
data = []
for i in range(500):
    data.append({
        'id': i+1,
        'email': random.choice([f'user{i}@test.com', '', None]),
        'age': random.choice([random.randint(18,80), None, -1, 150]),
        'amount': random.choice([round(random.uniform(0,10000),2), None, -100]),
        'status': random.choice(['active','inactive','pending','INVALID']),
        'phone': random.choice([f'1{random.randint(3-9,9)}{random.randint(100000000,999999999)}', 'invalid', ''])
    })

# 定义质量规则
engine = DataQualityEngine()
engine.add_rule(QualityRule('email_not_null','email','not_null',{},'error'))
engine.add_rule(QualityRule('age_range','age','range',{'min':0,'max':120},'error'))
engine.add_rule(QualityRule('amount_positive','amount','range',{'min':0,'max':1000000},'warning'))
engine.add_rule(QualityRule('status_valid','status','accepted_values',{'values':['active','inactive','pending']},'error'))
engine.add_rule(QualityRule('id_unique','id','unique',{},'error'))

results = engine.validate(data)
print("数据质量报告:")
for r in results:
    icon = "✅" if r.passed else "❌"
    print(f"  {icon} {r.rule_name}: {r.details}")
print(f"\n综合质量评分: {engine.quality_score()}/100")
print("✅ 验证通过 - 数据质量框架运行正常")
💡 实战建议:动手实现本课代码示例,修改参数观察输出变化。生产环境还需考虑错误处理、监控告警和数据安全。

🎯 质量规则引擎

  1. 100+质量规则
  2. 自动生成报告

🎯 质量监控仪表盘

  1. 实时质量分数
  2. 趋势分析

🏆 第19课成就解锁

🎁 下一课预告:数据血缘!

📖 原理深入:数据编排与治理体系

数据编排成熟度模型

级别特征编排方式治理水平
L1cron+脚本无统一调度无治理
L2Airflow/DbtDAG编排基本质量检查
L3编排+治理一体自动依赖发现数据目录+血缘
L4AI辅助编排自适应调度主动质量治理

数据治理框架:人+流程+工具

🏆 最佳实践:数据编排与治理检查清单

🔬 深度案例:生产环境实战经验

踩坑与解决方案

在生产环境中,我们经常遇到教科书不会告诉你的问题。以下是常见的实战经验和解决方案:

监控与运维指标

指标告警阈值监控方式
管道延迟超过SLA 120%端到端时间戳追踪
数据量偏差日均偏差超过30%与历史同期对比
错误率超过0.1%错误计数/总记录数
数据新鲜度超过SLA 150%最新数据时间戳
资源利用率CPU持续>80%系统监控
⚠️ 常见反模式
💡 架构演进建议:不要一开始就追求完美架构。从MVP开始,随业务增长逐步演进。每次演进都要回答三个问题:当前瓶颈是什么?解决它的投入产出比如何?是否为后续扩展留了空间?

📚 延伸阅读与参考

推荐资源

🤔 常见问题与解答

Q1: 如何选择批处理还是流处理?

A: 根据业务延迟要求决定:秒级用流处理、分钟级用微批、小时级用批处理。大部分场景批处理足够,流处理用于实时业务场景(风控、监控、推荐)。

Q2: 数据湖会取代数据仓库吗?

A: 不会完全取代,但边界在模糊。湖仓一体(如Iceberg/Delta Lake)正在融合两者优势。未来趋势是统一存储+多引擎计算。

Q3: 初创公司如何选择数据技术栈?

A: 先用云原生服务(BigQuery/Snowflake + Fivetran + dbt + Looker),验证业务后再考虑自建。过早优化是万恶之源。

Q4: 如何说服业务方投资数据治理?

A: 用钱说话:数据质量问题的直接经济损失(错误决策、合规罚款、重复劳动)远大于治理投入。量化问题是第一步。

性能调优实战技巧

数据工程团队协作模式

角色职责交付物
数据工程师管道开发与维护数据管道、基础设施
数据分析师数据分析与报表SQL查询、BI报表
数据科学家模型与实验ML模型、实验报告
数据产品经理需求与优先级PRD、数据产品规划
数据管家数据质量与治理质量规则、数据字典
💡 职业发展建议:数据工程是一个快速发展的领域。保持学习的关键是:1)理解原理而非仅会工具;2)动手实践而非仅看文档;3)关注社区动态,了解最新趋势;4)建立个人项目,积累实战经验。