4、ETL加工层血缘解析:ETL作业的输入输出映射、字段级转换逻辑的血缘追踪、多源数据融合时的血缘合并策略
ETL加工层是信用评分特征工程的核心战场。原始数据经过抽取、清洗、转换、聚合后,形成可直接用于建模的特征变量。在这一层,血缘解析需要穿透作业级别的输入输出映射,深入到字段级的转换逻辑,并处理多源数据融合时的血缘合并问题。本章将系统阐述这三类血缘解析方法。
4.1 ETL作业的输入输出映射
ETL作业的血缘解析首先需要建立作业级别的输入输出映射关系。每个ETL作业通常读取一个或多个源表,经过一系列转换后,写入一个或多个目标表。血缘解析需要记录这种“作业-表”级别的依赖关系。
下表列出了ETL作业输入输出映射的关键元数据字段:
| 元数据字段 | 描述 | 示例值 |
|---|---|---|
| 作业ID | ETL作业的唯一标识 | ETL_CREDIT_SCORE_DAILY |
| 作业类型 | SparkSQL、HiveSQL、Python脚本等 | SparkSQL |
| 输入表列表 | 作业读取的源表集合 | ods.loan_apply, ods.customer_info |
| 输出表列表 | 作业写入的目标表集合 | dwd.credit_feature_base |
| 调度依赖 | 上游作业ID列表 | ETL_ODS_LOAD_LOAN, ETL_ODS_LOAD_CUST |
| 执行频率 | 作业运行周期 | 每日凌晨02:00 |
在实际解析过程中,通常通过解析ETL脚本的SQL语句或配置文件来提取这些映射关系。对于SparkSQL作业,可以通过解析INSERT OVERWRITE TABLE、CREATE TABLE AS SELECT等语句来识别输入输出表。
-- 示例:解析SparkSQL作业中的输入输出映射
-- 原始SQL
INSERT OVERWRITE TABLE dwd.credit_feature_base
SELECT
a.apply_id,
a.customer_id,
a.apply_amount,
b.age,
b.gender,
b.income_level
FROM ods.loan_apply a
JOIN ods.customer_info b
ON a.customer_id = b.customer_id
WHERE a.dt = '${biz_date}';
-- 解析结果
-- 输入表: [ods.loan_apply, ods.customer_info]
-- 输出表: [dwd.credit_feature_base]
-- 关联条件: a.customer_id = b.customer_id
-- 过滤条件: a.dt = '${biz_date}'
4.2 字段级转换逻辑的血缘追踪
字段级血缘追踪是ETL加工层血缘解析的核心难点。它需要记录目标表中每个字段的来源字段、转换函数、聚合逻辑以及过滤条件。对于信用评分特征而言,字段级血缘直接关系到特征的可解释性和回溯能力。
字段级转换逻辑通常分为以下几类:
- 直接映射:源字段直接赋值给目标字段,无任何转换。例如:
target.col_a = source.col_a - 简单转换:通过数学运算、字符串处理、日期函数等对源字段进行转换。例如:
target.age = DATEDIFF(CURRENT_DATE, source.birth_date) / 365 - 聚合转换:通过GROUP BY和聚合函数(SUM、AVG、COUNT、MAX、MIN等)生成汇总字段。例如:
target.total_loan_amount = SUM(source.loan_amount) - 条件转换:通过CASE WHEN或IF语句进行条件判断后赋值。例如:
target.income_level = CASE WHEN source.income > 100000 THEN '高' WHEN source.income > 50000 THEN '中' ELSE '低' END - 多源关联:通过JOIN操作将多个源表的字段组合到目标表。例如:
target.customer_name = b.customer_name
下表展示了字段级血缘追踪的元数据模型:
| 目标字段 | 源字段路径 | 转换函数 | 转换类型 | 依赖表 |
|---|---|---|---|---|
| feature_age | ods.customer_info.birth_date | DATEDIFF(CURRENT_DATE, birth_date) / 365 | 简单转换 | ods.customer_info |
| feature_avg_loan_amt | ods.loan_apply.loan_amount | AVG(loan_amount) | 聚合转换 | ods.loan_apply |
| feature_income_level | ods.customer_info.income | CASE WHEN income > 100000 THEN '高' ... END | 条件转换 | ods.customer_info |
| feature_apply_cnt_30d | ods.loan_apply.apply_id | COUNT(DISTINCT apply_id) FILTER(WHERE apply_date >= DATE_SUB(CURRENT_DATE, 30)) | 聚合+过滤 | ods.loan_apply |
字段级血缘解析的技术实现通常依赖SQL解析器(如Antlr、Calcite)对ETL脚本进行抽象语法树(AST)分析。解析器需要识别SELECT子句中的每个表达式,并追踪其对应的源字段。
-- 字段级血缘解析示例
-- 目标表: dwd.credit_feature_base
-- 目标字段: feature_avg_loan_amt
-- 原始SQL片段
SELECT
a.apply_id,
AVG(a.loan_amount) AS feature_avg_loan_amt
FROM ods.loan_apply a
GROUP BY a.apply_id
-- 解析后的字段血缘
-- feature_avg_loan_amt
-- ├── 源表: ods.loan_apply
-- ├── 源字段: loan_amount
-- ├── 转换函数: AVG
-- ├── 分组字段: apply_id
-- └── 血缘路径: ods.loan_apply.loan_amount → AVG → feature_avg_loan_amt
4.3 多源数据融合时的血缘合并策略
信用评分特征通常需要融合多个数据源的信息,如申请数据、征信数据、行为数据、外部数据等。多源数据融合时的血缘合并策略决定了如何将不同来源的字段血缘关系整合到统一的目标字段上。
常见的多源融合场景包括:
- JOIN关联融合:通过主键关联多个表,将不同表的字段合并到同一行记录中。
- UNION合并融合:将结构相同的多个表的数据纵向合并,通常用于历史数据归档或分表合并。
- 特征衍生融合:基于多个源字段通过复杂计算生成新特征,如比率、差值、时间窗口统计等。
- 外部数据融合:引入第三方数据源(如征信报告、黑名单库)与内部数据关联。
血缘合并策略需要解决以下关键问题:
- 字段冲突消解:当多个源表包含同名字段时,需要明确目标字段的来源优先级或合并规则。
- 关联键血缘记录:JOIN操作中的关联键本身也需要记录血缘,因为关联键的准确性直接影响融合结果。
- 空值传播规则:多源融合时,某个源字段为空值时的处理策略(保留空值、使用默认值、从其他源补充)。
- 时间一致性:不同数据源的时间戳可能不一致,融合时需要明确时间对齐规则。
下表总结了不同融合场景下的血缘合并策略:
| 融合场景 | 血缘合并策略 | 示例 |
|---|---|---|
| JOIN关联 | 记录每个目标字段的完整源路径,包括关联键的血缘 | feature_income = ods.customer_info.income (通过 apply.customer_id = cust.customer_id 关联) |
| UNION合并 | 记录目标字段的多个源路径,标注数据来源表 | feature_apply_id = [ods.loan_apply_2024.apply_id, ods.loan_apply_2025.apply_id] |
| 特征衍生 | 记录所有参与计算的源字段及其转换函数 | feature_debt_ratio = ods.loan_apply.total_debt / ods.customer_info.income |
| 外部数据融合 | 记录外部数据源标识和关联方式 | feature_credit_score_ext = ext.credit_bureau.score (通过 customer_id 关联) |
下图展示了多源数据融合时的血缘合并流程:
4.4 血缘解析的工程化实现
在实际的信用评分系统中,ETL加工层的血缘解析需要工程化落地。以下是推荐的实现架构:
- SQL解析引擎:基于Antlr或Calcite构建SQL解析器,支持SparkSQL、HiveQL、MySQL等主流方言。
- 元数据存储:使用图数据库(如Neo4j)或关系型数据库存储血缘关系,支持高效的血缘查询和回溯。
- 增量解析机制:仅解析变更的ETL脚本,避免全量解析带来的性能开销。
- 血缘可视化:提供字段级血缘图谱,支持从目标字段向上游追溯,或从源字段向下游探查。
- 血缘校验:自动检测血缘断裂(如源表被删除、字段被修改)并发出告警。
下图展示了ETL加工层血缘解析的工程化架构:
4.5 血缘回溯在信用评分中的应用
ETL加工层的血缘解析最终服务于信用评分特征的回溯需求。当模型监控发现某个特征出现异常(如分布偏移、缺失率上升、业务含义不符)时,数据治理团队需要快速定位问题根源。
血缘回溯的典型应用场景包括:
- 特征异常排查:从异常特征字段出发,向上游追溯其数据来源和转换逻辑,定位是源数据问题、ETL逻辑错误还是业务规则变更。
- 模型版本对比:当模型迭代时,对比新旧版本的特征血缘差异,确保特征定义的一致性。
- 监管合规审计:向监管机构证明特征的计算过程符合业务逻辑和法规要求,提供完整的字段级血缘链路。
- 数据质量修复:当发现源数据质量问题(如字段缺失、格式错误)时,通过血缘分析评估受影响的目标特征范围。
通过ETL加工层的血缘解析,信用评分系统能够实现从原始数据到最终特征的全链路可追溯,为模型的可解释性、数据质量管理和监管合规提供坚实的技术基础。