2. 项目整体架构设计:四层架构图与职责说明
在风控数据SQL标签口径校准项目中,清晰、可扩展的架构是保障标签质量与口径一致性的基石。本章采用数据源层 → 标签加工层 → 口径校准层 → 应用层的四层架构,每一层职责明确、边界清晰,便于团队协作与后期维护。
架构设计核心原则: 数据分层、口径可追溯、加工与校准分离、输出标准化。
2.1 数据源层
数据源层负责接入风控业务所需的各类原始数据,是标签加工的原材料仓库。该层不进行任何业务逻辑计算,仅做数据接入、格式校验与基础清洗。
| 数据源类型 | 典型数据内容 | 接入方式 | 存储格式 |
|---|---|---|---|
| 业务库 | 用户信息、订单、还款、逾期记录 | JDBC/CDC | MySQL / Oracle |
| 埋点日志 | 用户行为、页面点击、设备信息 | Flume / Kafka | HDFS / Parquet |
| 外部征信 | 多头借贷、黑名单、评分卡 | API / 离线文件 | CSV / JSON |
实战建议: 数据源层需建立数据血缘元数据表,记录每个字段的来源表、采集时间、数据量级,为后续口径校准提供溯源依据。
2.2 标签加工层
标签加工层是SQL脚本开发的主战场。数据工程师基于数据源层,通过SQL脚本完成特征提取、指标计算、标签衍生,最终产出标签宽表。该层核心职责包括:
- SQL脚本开发: 编写可复用的标签加工脚本,遵循统一的命名规范与注释标准。
- 中间表管理: 建立临时表、中间表分层结构,避免重复计算,提升开发效率。
- 口径版本控制: 使用Git或SVN管理SQL脚本版本,每次口径变更需记录变更原因与影响范围。
- 标签宽表产出: 将加工后的标签整合为宽表,每行代表一个用户/订单,每列代表一个标签。
-- 示例:标签加工层SQL脚本片段(用户逾期天数标签)
INSERT OVERWRITE TABLE dm_user_overdue_days PARTITION(dt='${bizdate}')
SELECT
user_id,
MAX(overdue_days) AS max_overdue_days,
COUNT(CASE WHEN overdue_days > 0 THEN 1 END) AS overdue_cnt
FROM dwd_loan_detail
WHERE dt = '${bizdate}'
GROUP BY user_id;
2.3 口径校准层
口径校准层是整个架构的核心枢纽,负责解决多团队、多版本、多业务场景下的标签口径不一致问题。该层通过规则引擎与人工审核相结合的方式,确保每个标签的定义、计算逻辑、输出格式达成基线共识。
| 校准环节 | 输入 | 核心动作 | 输出 |
|---|---|---|---|
| 口径差异分析 | 多版本标签宽表 | 字段级对比、值分布差异检测 | 差异报告 |
| 校准规则引擎 | 差异报告 + 业务规则 | 自动匹配校准策略(取交集/取最新/取业务指定) | 校准建议 |
| 校准结果审核 | 校准建议 | 人工确认或批量审批 | 审核通过/驳回 |
| 口径基线锁定 | 审核通过的口径 | 写入口径基线表,锁定版本 | 基线版本号 |
常见陷阱: 口径校准层容易忽略“空值处理”与“边界条件”的差异。例如,逾期天数 = 0 与逾期天数 IS NULL 在风控策略中含义完全不同,校准时必须明确区分。
2.4 应用层
应用层是标签口径校准成果的最终输出端。经过校准的标签数据,以标准化接口或视图的形式提供给下游风控系统、数据产品与监管报送使用。
- 风控策略决策: 实时/离线调用校准后的标签,支撑准入、授信、定价等策略。
- 监控报表: 基于基线标签构建稳定性监控、分布监控、异常告警看板。
- 数据产品API: 对外提供统一的标签查询服务,屏蔽底层口径差异。
- 监管报送: 确保报送口径与基线一致,通过审计校验。
2.5 架构设计要点总结
| 架构层 | 核心产出 | 主要角色 | 关键质量指标 |
|---|---|---|---|
| 数据源层 | 原始数据表 / 日志文件 | 数据开发 / DBA | 数据完整性、时效性 |
| 标签加工层 | 标签宽表 / 中间表 | 数据工程师 | SQL执行效率、口径可读性 |
| 口径校准层 | 口径基线表 / 校准报告 | 风控数据专家 / 业务分析师 | 校准覆盖率、基线一致性 |
| 应用层 | 策略接口 / 报表 / API | 策略分析师 / 后端开发 | 响应延迟、数据准确性 |
架构落地检查清单:
✅ 每层是否有独立的存储与计算资源?
✅ 层与层之间的数据接口是否定义清晰(表名、字段、更新频率)?
✅ 口径校准层是否具备版本回滚能力?
✅ 应用层是否只消费基线标签,不直接引用加工层原始表?
✅ 每层是否有独立的存储与计算资源?
✅ 层与层之间的数据接口是否定义清晰(表名、字段、更新频率)?
✅ 口径校准层是否具备版本回滚能力?
✅ 应用层是否只消费基线标签,不直接引用加工层原始表?