<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>数据监控 on 老张开工了</title>
    <link>/%E6%95%B0%E6%8D%AE%E7%9B%91%E6%8E%A7/</link>
    <description>Recent content in 数据监控 on 老张开工了</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 15 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/%E6%95%B0%E6%8D%AE%E7%9B%91%E6%8E%A7/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>数据质量监控与异常处理</title>
      <link>/posts/2026/04/etl-data-quality/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      <guid>/posts/2026/04/etl-data-quality/</guid>
      <description>数据质量为什么是 ETL 的生命线 先讲一个真实的故事。某电商公司每天凌晨跑 ETL，把前一天的订单数据导入分析系统。数据团队每天早上的第一件事就是检查报表。有一天，市场部开会时发现 GMV（总成交额）比前一天跌了 80%。大家慌了——不是运营出了问题，而是 ETL 任务在凌晨 2 点因为源库连接超时失败了，但没有人发现。整个上午的决策都基于错误的数据。&#xA;这种情况在数据工程领域太常见了。数据管道的输出质量直接影响着下游的报表、分析和机器学习模型。没有质量监控的 ETL 管道，就像没有质检的生产线——你不知道产品里有没有混入次品，甚至不知道生产线是不是还在运转。&#xA;数据质量的六个维度 在建立数据质量监控之前，先要明确&amp;quot;质量好&amp;quot;到底是什么意思。业界通常用这六个维度来衡量：&#xA;准确性（Accuracy） 数据是否真实反映了现实世界的情况？一个用户的年龄写的是 200 岁，这不准确。一笔订单金额是负数，这也是不准确。&#xA;完整性（Completeness） 是否有缺失的数据？订单表里必须有订单号，如果订单号字段为空，就违反了完整性要求。在 ETL 场景中，完整性还指目标表的数据行数是否和源表一致。&#xA;一致性（Consistency） 数据在不同系统之间是否一致？用户表里姓名字段在数据库 A 中是 UTF-8 编码，在数据库 B 中是 GBK 编码，同一用户在两个系统中的姓名可能不一致。&#xA;时效性（Timeliness） 数据是否在预期的时间内可用？每日报表要求在早上 8 点前准备好，如果 ETL 任务跑到了中午 12 点，数据就是&amp;quot;过期&amp;quot;的。&#xA;唯一性（Uniqueness） 数据是否有重复？主键是否唯一？在 ETL 过程中，如果同一个订单被抽取了两次，就会破坏唯一性约束。&#xA;有效性（Validity） 数据是否满足定义的格式和规则？邮件地址必须包含 @，手机号必须是 11 位数字，枚举字段必须在定义的值范围内。&#xA;在 ETL 管道中嵌入质量检查 质量检查不应该在数据入仓之后再去做，而应该嵌入在 ETL 管道的每一个环节。&#xA;抽取阶段：源端检查 在抽取数据之前，先对源数据做基本检查：&#xA;def validate_source(source_config): &amp;#34;&amp;#34;&amp;#34;源端数据验证&amp;#34;&amp;#34;&amp;#34; checks = { &amp;#34;table_exists&amp;#34;: check_table_exists(source_config), &amp;#34;row_count_reasonable&amp;#34;: check_row_count(source_config), &amp;#34;freshness&amp;#34;: check_data_freshness(source_config), &amp;#34;schema_match&amp;#34;: check_schema(source_config), } failed = [name for name, passed in checks.</description>
    </item>
  </channel>
</rss>
