4. 数据血缘分析:血缘采集、血缘解析、血缘可视化

数据血缘,说白了就是数据的「身世档案」。

你拿到一张报表,里面的销售额是 1.2 亿。这 1.2 亿从哪来?是哪个业务系统的订单?经过了哪些清洗、聚合、转换?中间有没有被截胡或者算错?

我刚开始做数据治理的时候,最怕的就是业务方拿着报表来问:「这个数不对啊,你们是不是算错了?」然后我得花半天时间,翻代码、查日志、问同事,才能搞清楚数据是怎么流过来的。那感觉,就像在黑暗里摸象。

数据血缘分析,就是给数据装上「GPS」。它能告诉你:数据从哪来、经过了谁、变成了什么样、最终去了哪。

4.1 血缘采集:把「数据地图」的原材料搬回来

血缘采集,是第一步。你得先把数据流动的「痕迹」收集起来。

这些痕迹藏在哪?

  • SQL 脚本:ETL 脚本、存储过程、视图定义。这是最主流的来源。
  • 数据集成工具:比如 DataX、Kettle、Informatica 的作业定义。
  • 数据仓库元数据:表结构、字段注释、分区信息。
  • 日志文件:Spark 或 Flink 的执行计划日志。
  • 代码仓库:Git 里的数据管道代码。

采集方式,我一般分两种:

采集方式 原理 适用场景 我的经验
主动上报 数据平台在任务执行时,主动把血缘信息推送到血缘系统 自研数据平台、实时流处理 准确度高,但需要改造现有系统
被动扫描 定时扫描 SQL 脚本、日志文件,解析出血缘关系 存量系统、第三方工具 无侵入,但解析难度大
我的建议: 如果公司数据平台是自研的,优先用主动上报。准确率能到 95% 以上。被动扫描虽然省事,但遇到复杂 SQL 或存储过程,解析结果经常「缺胳膊少腿」。

采集频率怎么定?

  • 全量采集:每天凌晨跑一次,适合离线数仓。
  • 增量采集:任务执行完就触发采集,适合实时场景。
  • 事件驱动:只有元数据变更时才采集,适合稳定环境。

我曾经在一个项目里,因为采集频率设得太低,导致业务方看到的数据血缘还是三天前的。他们查了半天,发现源头表早就改名了。嗯,从那以后,我坚持用事件驱动 + 增量采集的组合。

4.2 血缘解析:把「原材料」变成「血缘关系」

采集回来的东西,是原始素材。你得把它解析成结构化的血缘关系。

解析的核心,是理解数据是怎么「流动」的。说白了,就是搞清楚:

  • 哪个表(字段)是输入?
  • 哪个表(字段)是输出?
  • 经过了什么操作(过滤、聚合、关联)?

解析的难点在哪?我列几个常见的坑:

  1. SQL 方言:Hive SQL、Spark SQL、MySQL SQL 语法不一样。解析器得兼容。
  2. 存储过程:里面可能嵌套循环、条件分支、临时表。解析起来像在解一团乱麻。
  3. 字段级血缘:表级血缘好做,字段级很难。比如 SELECT a.col1 + b.col2 AS c,你得知道 c 依赖了 a.col1 和 b.col2。
  4. 中间表:很多 ETL 会创建临时表,然后 drop 掉。血缘里要不要保留?我建议保留,否则链路会断。
核心原则: 血缘解析,宁可「过度解析」,也不要「漏解析」。漏了,链路就断了。断了,业务方就找不到根因了。

解析后的血缘关系,我一般用三元组表示:

{
  "source": "ods.order_detail.order_amount",
  "target": "dws.daily_sales.total_amount",
  "operation": "SUM",
  "transform": "SELECT SUM(order_amount) FROM ods.order_detail"
}

你想想看,如果每个字段的血缘都能解析成这样,那数据出问题的时候,定位根因就是秒级的事。

4.3 血缘可视化:让「数据地图」看得懂

解析出来的血缘关系,是一堆 JSON 或数据库记录。业务方看不懂,甚至很多开发也懒得看。

所以,得把它画出来。

血缘可视化,我踩过不少坑。最开始我用的是 D3.js,画出来的图很炫,但节点一多就卡死。后来换成力导向图,稍微好点,但用户还是抱怨「线太多,看不清」。

我的经验是:血缘可视化,核心不是「炫」,而是「清晰」。

几个设计原则:

  • 分层展示:按数据层级(ODS、DWD、DWS、ADS)分层。用户想看哪层点哪层。
  • 按需展开:默认只展示表级血缘。想看字段级,点击展开。
  • 高亮链路:选中某个字段,高亮它的上下游链路。其他无关节点变灰。
  • 搜索定位:支持按表名、字段名搜索。直接定位到目标节点。
  • 变更标记:如果某个表或字段最近有变更,用特殊颜色标记出来。
注意: 不要试图在一张图里展示所有血缘。那会变成「意大利面条图」,谁也看不懂。分层 + 按需展开,才是正道。

下面是我画的一张血缘可视化框架图,展示了从采集到展示的完整链路:

数据血缘分析全链路框架 血缘采集 SQL 脚本扫描 日志采集 元数据同步 血缘解析引擎 SQL 解析 | 字段级血缘 | 存储过程展开 | 中间表识别 血缘关系存储(图数据库 / 关系型) 血缘可视化展示 分层展示 | 按需展开 | 高亮链路 | 搜索定位 | 变更标记 核心链路:采集 → 解析 → 存储 → 可视化,环环相扣,缺一不可

4.4 血缘分析的实战价值

说了这么多,血缘分析到底能解决什么问题?

  • 问题溯源:报表数据异常,顺着血缘链路找到源头表,发现是上游业务系统数据没同步。
  • 变更影响分析:要改某个源表字段,先看血缘,知道下游有哪些表、报表、API 会受影响。
  • 数据质量监控:在血缘链路的每个节点设置质量规则,异常时自动告警。
  • 合规审计:监管要求提供数据来源证明,血缘就是最好的证据。
  • 数据资产盘点:通过血缘,找出哪些表是「孤岛」(没有下游依赖),哪些表是「热点」(被大量下游引用)。
一句话总结: 数据血缘,是数据治理的「基础设施」。没有它,你就是在盲人摸象。有了它,你手里就有了数据世界的「导航地图」。

我记得有一次,业务方说某个核心报表的数据连续三天对不上。我打开血缘系统,从报表字段一路往下追,发现是中间层的一个 ETL 任务改了关联条件,但没通知任何人。从定位问题到修复,只花了 15 分钟。业务方都惊了:「你们怎么这么快?」

嗯,这就是血缘分析的价值。