数据工程实战课程 · 实战项目阶段
构建企业级数据治理平台,集成数据目录、质量监控、血缘追踪、权限管理。
# 数据治理平台
import hashlib, json, time, random
from datetime import datetime
from collections import defaultdict
from dataclasses import dataclass, field
@dataclass
class DataAsset:
name: str; owner: str; tier: str; pii_fields: list = field(default_factory=list)
tags: list = field(default_factory=list); quality_score: float = 0
access_count: int = 0; created: str = ""
class GovernancePlatform:
def __init__(self):
self.catalog = {}; self.policies = []; self.audit_log = []
self.access_matrix = defaultdict(lambda: defaultdict(set))
def register(self, asset):
self.catalog[asset.name] = asset
return asset
def add_policy(self, name, rule_type, params):
self.policies.append({'name':name,'type':rule_type,'params':params})
def check_access(self, user, asset_name, action):
asset = self.catalog.get(asset_name)
if not asset: return False, "Asset not found"
# RBAC check
user_roles = self.access_matrix[user]
for policy in self.policies:
if policy['type'] == 'rbac':
if action in policy['params'].get('denied_actions',[]):
if user in policy['params'].get('denied_users',[]):
self.audit(f"DENY {user} {action} {asset_name}")
return False, f"Policy {policy['name']} denied"
# PII check
if action == 'read' and asset.pii_fields:
self.audit(f"PII_ACCESS {user} {asset_name} fields={asset.pii_fields}")
self.audit(f"ALLOW {user} {action} {asset_name}")
return True, "Access granted"
def mask_pii(self, records, fields):
masked = []
for r in records:
r = r.copy()
for f in fields:
if f in r and isinstance(r[f], str) and len(r[f]) > 2:
r[f] = r[f][:1] + '*' * (len(r[f])-2) + r[f][-1:]
masked.append(r)
return masked
def audit(self, message):
self.audit_log.append({'message':message,'time':datetime.now().isoformat()})
def quality_dashboard(self):
scored = [a for a in self.catalog.values() if a.quality_score > 0]
return {
'total_assets': len(self.catalog),
'avg_quality': round(sum(a.quality_score for a in scored)/len(scored),2) if scored else 0,
'pii_assets': sum(1 for a in self.catalog.values() if a.pii_fields),
'total_access': sum(a.access_count for a in self.catalog.values()),
}
# 构建治理平台
gov = GovernancePlatform()
gov.register(DataAsset('customers','data-team','gold',['phone','email'],['customer','pii'],0.95,100))
gov.register(DataAsset('orders','data-team','silver',[],['order','transaction'],0.88,500))
gov.register(DataAsset('products','product-team','gold',[],['product','catalog'],0.92,200))
gov.add_policy('pii_protection','rbac',{'denied_actions':['export'],'denied_users':['analyst']})
# 测试
allowed, msg = gov.check_access('analyst','customers','read')
print(f"analyst读customers: {allowed} ({msg})")
allowed, msg = gov.check_access('analyst','customers','export')
print(f"analyst导出customers: {allowed} ({msg})")
# 数据脱敏
records = [{'name':'张三','phone':'13800138000','email':'zhang@test.com','amount':1000}]
masked = gov.mask_pii(records, ['phone','email'])
print(f"脱敏: {masked}")
print(f"\n治理仪表盘: {gov.quality_dashboard()}")
print(f"审计日志: {len(gov.audit_log)}条")
print("✅ 验证通过 - 数据治理平台运行正常")
🎁 下一课预告:毕业项目!
| 阶段 | 目标 | 关键能力 | 周期 |
|---|---|---|---|
| MVP | 基础数据流转 | ETL+数仓+报表 | 1-3月 |
| 成长期 | 数据自助 | 自助分析+流处理+治理 | 3-6月 |
| 成熟期 | 数据驱动 | 实时+ML+数据产品 | 6-12月 |
| 领先期 | 数据创新 | AI+自动化+货币化 | 12月+ |
在生产环境中,我们经常遇到教科书不会告诉你的问题。以下是常见的实战经验和解决方案:
| 指标 | 告警阈值 | 监控方式 |
|---|---|---|
| 管道延迟 | 超过SLA 120% | 端到端时间戳追踪 |
| 数据量偏差 | 日均偏差超过30% | 与历史同期对比 |
| 错误率 | 超过0.1% | 错误计数/总记录数 |
| 数据新鲜度 | 超过SLA 150% | 最新数据时间戳 |
| 资源利用率 | CPU持续>80% | 系统监控 |
A: 根据业务延迟要求决定:秒级用流处理、分钟级用微批、小时级用批处理。大部分场景批处理足够,流处理用于实时业务场景(风控、监控、推荐)。
A: 不会完全取代,但边界在模糊。湖仓一体(如Iceberg/Delta Lake)正在融合两者优势。未来趋势是统一存储+多引擎计算。
A: 先用云原生服务(BigQuery/Snowflake + Fivetran + dbt + Looker),验证业务后再考虑自建。过早优化是万恶之源。
A: 用钱说话:数据质量问题的直接经济损失(错误决策、合规罚款、重复劳动)远大于治理投入。量化问题是第一步。
| 角色 | 职责 | 交付物 |
|---|---|---|
| 数据工程师 | 管道开发与维护 | 数据管道、基础设施 |
| 数据分析师 | 数据分析与报表 | SQL查询、BI报表 |
| 数据科学家 | 模型与实验 | ML模型、实验报告 |
| 数据产品经理 | 需求与优先级 | PRD、数据产品规划 |
| 数据管家 | 数据质量与治理 | 质量规则、数据字典 |