简介:这份文档记录百信银行数据治理的一线落地经验,面向银行及金融机构的数据治理、数据管理与合规风控从业者,也适合正在搭建数据治理体系的技术管理者参考。内容从国家与监管动态切入,梳理《银行业金融机构数据指引》在治理架构、数据管理、质量控制、价值实现与监督方面的要求,以及EAST报送质量稽核等最新监管动作;随后剖析推动难、落地难与“组织流程制度”“推动落地工具”两张皮等典型痛点,其中数据标准落地、业务系统源头数据质量整改、数据出航安全管控等场景颇具代入感。组织架构部分讲到董事会牵头、数据安全管理委员会决策、大数据部统筹及各专项小组协同的机制,核心是自上而下获取管理力度。整包含1个docx文档,约3.92MB,已有149人学习,适合需要借鉴同业成熟做法的读者。
1. 为什么银行的数据治理常常从"对不上账"开始
某天业务部门拿着两份报表找上门:手机银行口径的"活跃客户数"和核心系统口径差了近两万。这种场景在百信银行这类数字银行里并不罕见——没有实体网点,所有业务都跑在系统里,数据一旦口径不一致,会直接反映到报表、风控和监管报送上。数据治理实践要解决的不是买一套平台把数据"管起来",而是把"谁定义口径、谁负责质量、谁维护标准"这套机制落到流程和工具上,让差异能被发现、能被定位、能被修掉。它适合数据仓库、数据平台、风控与报送链条上的工程师,也适合刚接手治理项目的技术负责人。
2. 数据治理流程与车轮图:先把框架立住
治理项目最容易翻车的地方,是一上来就采购平台、批量建目录,却没有一套能反复运转的流程。百信银行这类数字化银行的特点是系统多、迭代快、监管报送要求硬,框架必须先立住,工具才有地方挂。业内常用"车轮图"向业务方解释治理范围,用"流程"约束执行节奏:一个是全局视图,一个是动作序列,缺一不可。
2.1 数据治理流程的五个阶段
常见的治理流程可以拆成规划、标准、落标、监控、改进五段,本质上是 PDCA 在数据域上的映射。
规划阶段定范围:先圈出监管报送、核心经营指标、客户主数据这几类高价值对象,而不是全行铺开。范围太大,第一批问题清单就会长到没人敢认领。标准阶段定口径:把指标定义、字段命名、码值、脱敏规则写成系统可读取的条目,而不是文档里的自然语言。落标阶段做映射:把已建标准与存量库表字段逐一匹配,未匹配的进整改清单。监控阶段做度量:用规则库对存量数据跑批,输出问题明细和责任人。改进阶段做闭环:把高频问题回写到标准或流程里,进入下一轮迭代。
这五段不是走完一遍就结束,而是按季度或月度为周期滚动。判断一个治理项目是否真的在转,看的是"问题清单是否在收敛"和"标准条目是否在被引用",而不是看平台上线了多少功能模块。
2.2 数据治理车轮图怎么读
车轮图的价值在于让非技术同事一眼看懂治理覆盖哪些方面。它的中心是治理组织与策略,辐条连接各个治理域,外圈则是贯穿所有域的流程与工具。
| 位置 | 含义 | 典型落地物 |
|---|---|---|
| 轮心 | 治理组织、制度与决策机制 | 治理委员会、管理办法、例会机制 |
| 辐条一 | 数据标准 | 指标字典、命名规范、码值表 |
| 辐条二 | 数据质量 | 规则库、稽核报告、整改单 |
| 辐条三 | 元数据 | 数据目录、字段血缘、影响分析 |
| 辐条四 | 主数据 | 客户、机构、产品主数据 |
| 辐条五 | 数据安全 | 分级分类、脱敏、访问审批 |
| 辐条六 | 生命周期 | 归档、冷热分层、销毁策略 |
| 轮圈 | 流程与工具平台 | 流程引擎、治理平台、调度 |
读这张图的关键是:辐条之间不能各自为政。比如安全分级分类的标签,应该直接作为数据质量规则和脱敏策略的输入;主数据的编码规则,应该来自数据标准。辐条之间没有引用关系,车轮就转不动。
2.3 从流程到责任矩阵
流程落到人头上,靠的是责任矩阵。下面这张表是常见做法,按治理活动拆到角色,避免出现问题无人认领。
| 治理活动 | 业务部门 | 数据团队 | 平台/IT | 治理委员会 |
|---|---|---|---|---|
| 指标口径定义 | 负责 | 协助 | 知会 | 审批 |
| 标准制定 | 参与 | 负责 | 协助 | 审批 |
| 落标整改 | 负责 | 协助 | 负责 | 知会 |
| 质量稽核 | 协助 | 负责 | 协助 | 知会 |
| 安全分级 | 协助 | 协助 | 负责 | 审批 |
矩阵定下来后,可以用一张配置表把它固化到流程引擎里,让每个问题自动找到责任人。
# 责任矩阵配置:activity -> {role: r/a/c/i} RACI = { "metric_definition": {"biz": "R", "data": "A", "it": "C", "gov": "A"}, "standard_build": {"biz": "C", "data": "R", "it": "C", "gov": "A"}, "standard_fix": {"biz": "A", "data": "C", "it": "R", "gov": "I"}, "quality_check": {"biz": "C", "data": "R", "it": "C", "gov": "I"}, } def owner_of(activity): # R 为执行责任人,A 为最终问责人 roles = RACI.get(activity, {}) return [r for r, v in roles.items() if v == "R"]这段配置把"谁执行、谁问责"从会议纪要搬到代码里,流程系统生成整改单时可以直接调用owner_of()派单。R 是执行责任人,A 是最终问责人,C 表示需被咨询,I 表示需被知会。参数随组织架构调整,改动集中在字典里,不用改业务逻辑。
3. 元数据、数据标准与数据质量的工程化落地
框架讲清之后,真正难的是把治理动作做成可调度、可复现的工程任务。元数据、数据标准、数据质量是三条主线,前者回答"有什么",中间回答"应该长什么样",后者回答"实际长什么样",三者串起来才形成闭环。
3.1 元数据自动采集:从库表到血缘
元数据靠人工登记永远跟不上迭代速度,常规做法是定时从 information_schema 或数仓元数据接口批量拉取。下面以 MySQL 为例采集字段级元数据。
import pymysql def collect_columns(conn, schema): # 拉取指定库下所有表的字段名、类型与注释 sql = """ SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT, ORDINAL_POSITION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = %s ORDER BY TABLE_NAME, ORDINAL_POSITION """ with conn.cursor(pymysql.cursors.DictCursor) as cur: cur.execute(sql, (schema,)) rows = cur.fetchall() # 补充血缘:从视图或 ETL 脚本解析中获取上游,这里预留字段 for r in rows: r["upstream"] = resolve_upstream(schema, r["TABLE_NAME"]) return rows def resolve_upstream(schema, table): # 实际项目中可解析建表语句、调度 DAG 或 SQL 任务配置 return [] # 无血缘时返回空列表,避免下游报错采集的关键在字段注释和血缘。information_schema.COLUMNS提供字段名和类型,COLUMN_COMMENT是标准落标的重要比对源,如果注释长期为空,落标率会很难看。resolve_upstream()是血缘入口,实际项目里从调度 DAG、视图定义或 ETL 脚本解析获取,采集频率一般与建表变更同步,做成每日增量。
3.2 数据标准落标的校核 SQL
有了字典和字段元数据,落标就是一次关联比对。下面这条 SQL 用来找出未匹配标准的字段,直接输出了整改清单。
-- 找出数仓中尚未匹配数据标准的字段 SELECT c.TABLE_NAME, c.COLUMN_NAME, c.COLUMN_COMMENT, s.std_code, s.std_name FROM information_schema.COLUMNS c LEFT JOIN gov_data_standard s ON s.field_name = c.COLUMN_NAME AND s.status = 'active' WHERE c.TABLE_SCHEMA = 'dw' AND s.std_code IS NULL; -- 无匹配标准即视为未落标gov_data_standard是维护标准条目的表,field_name与字段名做匹配,实际项目里往往还需要结合数据类型和中文字段名做二次模糊匹配。status='active'过滤掉已下线的标准,避免拿旧标准去比对。查询结果按表名分组,直接生成整改单派给责任人,整改后再跑一次即可看到落标率变化。
3.3 数据质量规则与校验任务
质量规则按维度归类,常见的有完整性、唯一性、有效性、一致性、及时性六类,每类都能落成可执行的校验。
| 维度 | 检查内容 | 典型规则 |
|---|---|---|
| 完整性 | 关键字段是否为空 | 客户号非空 |
| 唯一性 | 主键是否重复 | 客户号全局唯一 |
| 有效性 | 值域是否合法 | 证件类型在码值表内 |
| 一致性 | 跨表口径是否一致 | 余额与明细汇总相等 |
| 及时性 | 数据是否按时到达 | T+1 分区按时产出 |
-- 完整性 + 唯一性稽核,输出问题统计 SELECT COUNT(*) AS total_rows, SUM(CASE WHEN cust_id IS NULL THEN 1 ELSE 0 END) AS null_cnt, COUNT(*) - COUNT(DISTINCT cust_id) AS dup_cnt, ROUND(SUM(CASE WHEN cust_id IS NULL THEN 1 ELSE 0 END) / COUNT(*), 4) AS null_rate FROM dw.dim_customer WHERE dt = '${bizdate}';这条 SQL 一次返回总量、空值和重复数。null_rate用于和阈值比较,超过阈值即触发告警。${bizdate}是调度参数,由平台在运行时替换。规则跑完把结果写入稽核结果表,配合责任矩阵自动派单,问题修复后再跑一次形成前后对比。
4. 非结构化数据治理:文本、影像与日志怎么盘
结构化数据治理成熟后,非结构化数据往往是下一个短板。银行场景里的非结构化数据来自合同影像、工单文本、呼叫中心录音转写、系统日志等,体量大、格式杂、没有天然的字段结构,靠传统目录管理很难覆盖。治理思路是把"内容"降维成"可管理的元数据",再按元数据去管、去检索、去设权限。
4.1 非结构化数据的元数据从哪抽
非结构化数据的最小治理单元是文件本身加上抽取出来的元数据。文件级元数据包括路径、大小、创建时间、格式、哈希值;内容级元数据包括文档类型、涉及的主体、金额、日期等业务属性。
import os import hashlib import re def file_meta(path): stat = os.stat(path) # 用内容哈希做去重和版本判定 h = hashlib.md5() with open(path, "rb") as f: for chunk in iter(lambda: f.read(8192), b""): h.update(chunk) return { "path": path, "size": stat.st_size, "ext": os.path.splitext(path)[1].lower(), "mtime": stat.st_mtime, "md5": h.hexdigest(), }md5用于去重,同一份合同被重复上传多次时只保留一份。ext和size是后续存储分层和归档策略的依据。文件级元数据抽取成本低,是所有非结构化治理的第一步,也是后面内容抽取的索引基础。
4.2 正则与轻量 NLP 做内容识别
内容级元数据靠抽取。优先用规则命中率高、成本低的字段,比如身份证号、手机号、金额,再考虑引入模型做分类。
import re PATTERNS = { "id_no": r"\b\d{17}[\dXx]\b", "phone": r"\b1[3-9]\d{9}\b", "amount": r"(\d+(?:\.\d+)?)\s*元", } def extract_content(text): result = {} for name, pat in PATTERNS.items(): hit = re.findall(pat, text) result[name] = hit[:5] # 只保留前 5 个命中,控制存储 return resultPATTERNS按字段名维护,新增字段只加一行。命中结果做截断是为了控制元数据表体积,实际项目里通常还要加置信度或来源位置。这里抽出的身份证号、手机号属于敏感信息,写入元数据前必须先脱敏,否则治理动作本身就制造了新的合规风险。
4.3 存储分层与检索
非结构化数据按访问频率分层:热数据放对象存储的高频层,配套元数据入库支持检索;温数据转低频层,保留元数据做定位;冷数据归档并保留校验和。
检索入口统一走元数据表,而不是直接扫文件。比如按主体查合同,先用元数据表定位文件路径,再取文件,避免全量遍历。权限控制挂在元数据表上,按数据分级分类的标签授权,文件层只做落地校验。这样一套下来,非结构化数据至少能做到"找得到、说得清、管得住",比堆在共享盘里前进一大截。
5. 治理效果的度量口径与三个高频坑
治理做得好不好,靠数据说话。最直接的指标是标准落标率、规则通过率和问题闭环时长,三者组合起来能反映治理是否真在转。
| 指标 | 计算方式 | 参考阈值 |
|---|---|---|
| 落标率 | 已匹配标准字段数 / 总字段数 | 逐季上行 |
| 规则通过率 | 通过稽核的记录数 / 总记录数 | 按维度分别设阈值 |
| 平均闭环时长 | 问题从派单到关闭的时长均值 | 逐季下行 |
一个容易被忽略的技巧是给指标做趋势而不是看绝对值。落标率从 60% 到 72% 说明治理在推进,从 72% 回落到 68% 则往往意味着新增系统没有走落标流程,要回头查流程卡在哪。
三个高频坑值得点名。第一是把治理做成运动式项目,集中整改一轮后没人维护标准和规则,半年后问题重来;正确做法是把落标和稽核挂到上线流程里,新建表强制校验标准。第二个坑是只建目录不建血缘,影响分析做不了,改一个字段不知道会波及哪些报表。可以用下面这段做字段影响面的快速排查。
-- 通过标准编码反查引用该字段的表 SELECT DISTINCT m.TABLE_NAME FROM gov_metadata m JOIN gov_data_standard s ON s.field_name = m.COLUMN_NAME WHERE s.std_code = 'STD_CUST_ID';这条 SQL 以标准编码为入口,反查所有引用字段的表,用于变更前的影响评估。std_code是标准条目的唯一编码,比字段名更稳定,改名时只要编码不变,血缘关系不断。
第三个坑是脱敏策略与标准脱节,标准里标了敏感字段,脱敏任务却没覆盖到。稳妥做法是让脱敏任务直接从标准的密级字段取值,规则只维护"密级到脱敏算法"的映射,标准改一次、脱敏自动跟着变,避免两套配置长期漂移。
本文还有配套的精品资源,点击获取