2、核心概念解析:上游与下游、数据表、字段、ETL任务、调度依赖

说实话,很多刚接触数据工程的同学,一上来就被各种术语砸晕了。什么血缘、什么依赖、什么调度……其实没那么复杂。今天这一章,我就带你把这些核心概念一个一个掰开揉碎,讲清楚。

我个人习惯把血缘追踪比作一张「数据地图」。你想想看,地图上得有起点、终点、路线、路标吧?血缘追踪也一样——你得知道数据从哪来(上游)、到哪去(下游)、经过了哪些表、哪些字段、哪些任务。下面我们一个一个来看。

2.1 上游与下游:数据的「来龙去脉」

先说最简单的。上游就是数据的来源,下游就是数据的去向。举个例子:

  • 上游:原始日志表、业务数据库、外部API接口
  • 下游:汇总报表、数据仓库宽表、机器学习特征表

我在项目中遇到过一种情况:某天凌晨的调度任务突然报错,下游的报表全挂了。排查了半天,发现是上游的一个字段类型从 int 改成了 string,ETL 任务没适配,直接崩了。你看,这就是典型的上下游依赖问题。

核心原则:上游的变动,必须通知下游。否则就是「牵一发而动全身」。

怎么判断谁是谁的上游?很简单——看数据流向。数据从 A 表经过 ETL 加工后写入 B 表,那 A 就是 B 的上游,B 就是 A 的下游。嗯,这里要注意:一个节点可以同时是多个节点的上游,也可以同时是多个节点的下游。这就是血缘关系的「多对多」特性。

2.2 数据表与字段:血缘追踪的最小单元

表级血缘和字段级血缘,是两个完全不同的粒度。我建议你一开始就做字段级,别偷懒。

为什么?因为表级血缘只能告诉你「这张表依赖了那张表」,但具体依赖了哪个字段?不知道。举个例子:

-- 表级血缘:order_summary 依赖 order_detail
-- 字段级血缘:order_summary.total_amount 来自 order_detail.price * order_detail.quantity

你看,字段级血缘能精确到「哪个字段怎么算出来的」。这在排查数据质量问题的时候特别有用。我曾经花了一整天追一个数据对不上的问题,最后发现是上游表的一个字段被重命名了,但下游的 ETL 脚本没更新。如果有字段级血缘追踪,这种问题一眼就能看出来。

粒度 能回答的问题 适用场景
表级 这张表依赖哪些表? 快速概览、影响分析
字段级 这个字段从哪来?怎么算的? 数据质量排查、合规审计

我的建议:如果团队刚起步,先做表级血缘,快速跑通流程。等稳定了,再逐步细化到字段级。别一上来就想做完美,容易把自己累死。

2.3 ETL任务:血缘关系的「搬运工」

ETL 任务就是那个把数据从上游搬到下游的「搬运工」。它负责三件事:

  1. Extract(抽取):从上游数据源读取数据
  2. Transform(转换):清洗、过滤、聚合、关联
  3. Load(加载):写入下游目标表

在血缘追踪里,ETL 任务就是一条「边」。它连接了上游表和下游表,同时记录了转换逻辑。举个例子:

-- 一个简单的 ETL 任务
INSERT INTO dws.daily_sales
SELECT 
    order_date,
    product_id,
    SUM(amount) AS total_amount
FROM ods.orders
WHERE status = 'completed'
GROUP BY order_date, product_id;

这个任务的血缘关系就是:ods.orders(上游表)→ dws.daily_sales(下游表),字段 amount 经过 SUM 聚合后变成了 total_amount。

注意:ETL 任务里的逻辑越复杂,血缘追踪就越难做。尤其是那些嵌套子查询、存储过程、动态 SQL,解析起来非常头疼。我曾经在一个项目里遇到一个 800 行的存储过程,里面全是动态拼接的 SQL……嗯,那是我职业生涯最黑暗的一周。

2.4 调度依赖:谁先跑,谁后跑

调度依赖解决的是「执行顺序」问题。说白了就是:B 任务依赖 A 任务,那 A 必须先跑完,B 才能开始跑。

常见的调度依赖类型有:

  • 时间依赖:每天凌晨 2 点跑,不管上游跑没跑完
  • 任务依赖:等上游任务跑完了再跑
  • 数据依赖:等上游表有数据了再跑(比如检测分区是否存在)

我个人最推荐的是「数据依赖」。为什么?因为时间依赖太死板,万一上游任务延迟了,下游就白跑了。任务依赖虽然好一点,但有时候上游任务跑完了,数据还没完全写入(比如事务还没提交)。数据依赖是最稳妥的——你告诉我分区存在了,我再开始跑。

避坑指南:我曾经遇到过一个经典问题——两个任务互相依赖。A 依赖 B,B 依赖 A,形成了死循环。调度系统直接卡死,所有任务都不跑了。所以设计依赖关系的时候,一定要保证是「有向无环图(DAG)」。

2.5 知识体系总览

下面这张图,把上面讲的所有概念串起来了。你可以把它当作本章的「知识地图」:

血缘追踪核心概念关系图 血缘追踪核心概念关系图 上游数据源 ETL 任务 下游目标表 抽取 加载 字段级血缘示例 ods.orders.amount SUM(amount) dws.sales.total 调度依赖示例(DAG) 任务A 任务B 任务C 任务D

这张图里,上半部分展示了数据从上游到下游的流转过程,中间是 ETL 任务作为桥梁。左下角是字段级血缘的细化示例,右下角是调度依赖的 DAG 结构。你看,所有概念都是环环相扣的。

2.6 小结

这一章我们讲了五个核心概念:

  • 上游与下游:数据的来源和去向,决定了依赖关系
  • 数据表与字段:表级和字段级两种粒度,字段级更精细但更复杂
  • ETL任务:数据的搬运工,也是血缘关系的载体
  • 调度依赖:保证任务按正确顺序执行,避免死循环