4. 实体解析流程:数据采集、清洗、标准化、匹配、聚合、输出
金融实体解析(Entity Resolution, ER)是将来自不同数据源、描述同一现实世界金融实体的记录进行识别、链接与合并的过程。在《金融实体解析回放对比SQL分析》课程中,理解ER的标准流程是构建回放与对比分析的基础。本章将详细拆解ER的六大核心阶段:数据采集、清洗、标准化、匹配、聚合与输出。
课程提示: 实体解析的每个阶段都会在SQL回放日志中留下关键标记。掌握这些阶段,是后续通过SQL分析解析质量、定位匹配错误的前提。
4.1 实体解析六阶段总览
下图展示了实体解析的完整流水线,从原始数据输入到最终实体输出,每个阶段都承担着特定的数据转换与决策职责。
4.2 阶段一:数据采集(Data Ingestion)
数据采集是实体解析的起点,负责从多个金融数据源中提取原始记录。在SQL回放场景中,采集阶段通常对应INSERT或SELECT INTO操作,将源表数据加载到解析工作区。
4.2.1 常见金融数据源
| 数据源类型 | 典型系统 | 采集方式 | 数据特征 |
|---|---|---|---|
| 核心银行系统 | IBM CICS, T24 | 批量ETL / CDC | 结构化,高一致性 |
| 交易风控平台 | IBM Safer Payments | 实时流式接入 | 高吞吐,毫秒级延迟 |
| 客户信息库 | MDM, CRM | API / 数据库链接 | 半结构化,含地址、证件 |
| 外部征信数据 | 央行征信、百行征信 | 文件交换 / Web Service | 标准格式,定期更新 |
4.2.2 采集阶段的SQL回放标记
-- 示例:将交易流水表加载到解析临时表
INSERT INTO er_work.txn_raw
SELECT txn_id, acct_no, txn_date, amount, merchant_code
FROM source_oltp.txn_log
WHERE txn_date >= '2024-01-01';
回放分析要点: 在SQL回放日志中,采集阶段应记录
source_table、row_count、load_timestamp。对比不同回放版本时,需关注数据源范围是否一致,避免因采集遗漏导致解析结果偏差。
4.3 阶段二:数据清洗(Data Cleaning)
数据清洗旨在识别并修正原始数据中的质量问题。金融数据对准确性要求极高,清洗不彻底会直接导致匹配错误或实体分裂。
4.3.1 清洗操作清单
- 缺失值处理: 对关键字段(如身份证号、统一社会信用代码)进行空值填充或标记。
- 异常值检测: 过滤金额为负、日期为未来时间等明显错误。
- 重复记录去重: 在同一数据源内消除完全一致的冗余行。
- 格式校验: 验证电话号码位数、邮箱格式、证件号码校验位。
-- 清洗示例:过滤异常交易并补全缺失的商户分类
UPDATE er_work.txn_raw
SET merchant_category = 'UNKNOWN'
WHERE merchant_category IS NULL;
DELETE FROM er_work.txn_raw
WHERE amount <= 0 OR txn_date > CURRENT_DATE;
4.4 阶段三:标准化(Standardization)
标准化将不同源系统的数据转换为统一的表示形式,消除格式异构。这是匹配阶段能够准确计算相似度的前提。
4.4.1 标准化规则示例
| 字段类型 | 源A格式 | 源B格式 | 标准化后格式 |
|---|---|---|---|
| 日期 | 2024/01/15 | 15-JAN-2024 | 2024-01-15 |
| 身份证号 | 110101199001011234 | 110101 19900101 1234 | 110101199001011234 |
| 电话号码 | +86 138-0000-1111 | 13800001111 | 8613800001111 |
| 地址 | 北京市朝阳区XX路1号 | 北京朝阳XX路1号 | 北京市-朝阳区-XX路-1号 |
-- 标准化SQL示例:统一日期格式
UPDATE er_work.txn_std
SET txn_date_std = TO_CHAR(TO_DATE(txn_date_raw, 'YYYY/MM/DD'), 'YYYY-MM-DD')
WHERE source_system = 'SYSTEM_A';
UPDATE er_work.txn_std
SET txn_date_std = TO_CHAR(TO_DATE(txn_date_raw, 'DD-MON-YYYY'), 'YYYY-MM-DD')
WHERE source_system = 'SYSTEM_B';
4.5 阶段四:匹配(Matching)
匹配是实体解析的核心决策环节。通过计算不同记录间的相似度,判定它们是否指向同一金融实体。匹配算法通常分为确定性匹配与概率性匹配两类。
4.5.1 匹配算法对比
| 算法类型 | 原理 | 适用场景 | SQL实现复杂度 |
|---|---|---|---|
| 精确匹配 | 字段值完全相等 | 唯一标识符(如身份证号) | 低 |
| 编辑距离 | 字符串差异度量 | 姓名、地址模糊匹配 | 中(需自定义函数) |
| Jaro-Winkler | 前缀权重编辑距离 | 短字符串(人名、机构名) | 中 |
| TF-IDF + 余弦相似度 | 词频向量空间相似度 | 长文本(地址、公司描述) | 高 |
-- 匹配阶段SQL示例:基于身份证号精确匹配候选对
SELECT a.record_id AS left_id,
b.record_id AS right_id,
'ID_CARD_EXACT' AS match_rule,
1.0 AS similarity_score
FROM er_work.txn_std a
JOIN er_work.txn_std b
ON a.id_card = b.id_card
WHERE a.source_system < b.source_system; -- 避免重复对
匹配陷阱: 仅依赖单一字段匹配可能导致高误报率。金融实体解析通常采用多字段加权投票策略,例如:身份证号匹配权重0.6,姓名匹配权重0.3,出生日期匹配权重0.1。SQL回放分析中,需记录每条匹配规则的贡献度。
4.6 阶段五:聚合(Aggregation / Entity Merging)
聚合阶段将匹配环节识别出的同一实体下的多条记录合并为一条“黄金记录”(Golden Record)。合并策略包括属性选择、冲突解决与历史追溯。
4.6.1 聚合策略
- 最新值优先: 取时间戳最近的记录值。
- 高置信度源优先: 核心银行系统数据优先级高于外部数据。
- 字段级投票: 多个源中取值最多的值作为最终值。
- 保留历史快照: 聚合后的实体需关联原始记录ID,支持回放追溯。
-- 聚合示例:合并同一实体的地址信息,取最新非空值
INSERT INTO er_work.entity_golden (entity_id, address, updated_at)
SELECT entity_id,
COALESCE(
MAX(CASE WHEN source_rank = 1 THEN address END),
MAX(CASE WHEN source_rank = 2 THEN address END)
) AS best_address,
MAX(updated_at)
FROM er_work.entity_candidates
GROUP BY entity_id;
4.7 阶段六:输出(Output)
输出阶段将聚合后的实体结果交付给下游系统,同时生成解析日志供后续回放对比分析使用。输出格式通常包括实体宽表、增量变更流以及解析质量报告。
4.7.1 输出产物清单
| 输出类型 | 内容 | 消费方 | 回放分析价值 |
|---|---|---|---|
| 实体黄金表 | 每个实体的最终属性 | 风控系统、CRM | 对比不同版本实体属性变化 |
| 匹配对明细表 | 所有匹配记录对及相似度 | 数据治理团队 | 分析匹配规则准确率 |
| 解析统计报告 | 实体数、匹配率、聚合冲突数 | 管理层、审计 | 评估解析整体质量 |
| 回放日志表 | 每个阶段的SQL操作与影响行数 | SQL分析平台 | 定位解析差异根因 |
-- 输出示例:将解析结果写入最终实体表
INSERT INTO dwd.entity_golden_final
SELECT entity_id, entity_name, id_card, address, phone,
CURRENT_TIMESTAMP AS etl_time
FROM er_work.entity_golden;
4.8 六阶段数据流转关系图
下图以数据视角展示各阶段之间的输入输出关系,突出每个阶段对数据形态的转换作用。
4.9 各阶段在SQL回放中的关键字段
为了支持后续的“回放对比”分析,每个阶段在日志表中都应记录以下关键元数据字段:
| 阶段 | 日志表关键字段 | 对比分析用途 |
|---|---|---|
| 采集 | source_system, batch_id, row_count |
检查数据源范围与加载量是否一致 |
| 清洗 | cleaning_rule, rows_affected, error_type |
对比清洗规则执行差异 |
| 标准化 | field_name, before_value, after_value |
定位标准化规则变更导致的匹配差异 |
| 匹配 | match_rule, similarity_score, pair_count |
分析匹配阈值调整对结果的影响 |
| 聚合 | entity_id, merged_record_ids, conflict_field |
追溯实体合并过程中的冲突解决策略 |
| 输出 | output_table, entity_count, output_timestamp |
验证最终结果是否完整交付 |