拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

金融数据产品实战:从分层数仓到数据治理与质量监控

金融数据产品实战:从分层数仓到数据治理与质量监控

我刚入行那会儿,金融圈的数据人聚在一起,聊的不是什么高大上的算法,而是“为啥今天报表里AUM和理财台总对不上”“存量客户流失预警名单到底信不信得过”。这些看似琐碎的问题,恰恰是金融行业做数据产品的核心命题。大数据技术这些年发展很快,但真正落到金融场景里,拼的不是算力多强,而是能不能在严苛的安全合规环境下,把分散在各业务系统的数据变成业务人员每天敢用、愿用的决策工具。这篇文章是我这几年做金融数据项目的一些实战总结,围绕数据产品的设计、分层数仓、数据治理、质量监控和问题排查来展开,适合金融机构里的数据工程师、数据产品经理、数据分析师,以及想从互联网跳进金融数据领域的同学参考。

金融行业数据产品的定位与整体设计思路

1.1 金融机构的真实数据痛点

金融机构跑了几十年业务,核心系统、信贷系统、渠道系统、客服系统各管一摊,数据孤岛是常态。业务想要一个“客户在银行到底有多少资产”的全景视图,往往要从存款、理财、基金、保险好几个系统里分别取数,然后手工用Excel拼接,不仅慢,而且经常因为口径不同对不上账。传统报表系统又停留在“每天跑批、月初出表”的模式,业务临时想看一个数,得提工单排队,等BI团队导出数据再加工,一来一回半天就没了。

更头疼的是数据交叉验证能力弱。同一客户在存款条线的资产情况和在信用卡条线的消费行为,往往没法做关联分析。风控团队想建模型,缺变量,只能自己写脚本从库里捞数据,清洗质量全靠个人水平。这些痛点叠加在一起,决定了金融数据产品不能只做一个漂亮的大屏,它必须具备几个基本能力:统一接入多源数据、构建可复用的业务主题、提供灵活的查询与订阅服务、在关键节点卡住数据质量。

1.2 三种典型数据产品形态

我在金融行业见到的数据产品,大致可以分成三类。

第一类叫看板型,面向管理层和运营团队,展示资产规模、收入结构、客户增长、渠道转化等核心指标,特点是查询频率高、粒度偏汇总、对时效要求一般是T+1。第二类叫服务型,面向业务系统和数据分析师,以API或定时任务表的方式输出客户风险评分、流失概率、实时授信额度等变量,特点是接口稳定、链路可监控、对可用性要求极高。第三类叫算法型,面向精细化运营场景,直接产出处置动作,比如流失预警名单、交叉销售推荐清单、反欺诈评分。这三类形态不是互斥的,很多数据产品是“看板+服务”的组合,但底层一定要依赖同一套分层数仓,否则各做各的,指标口径迟早分叉。

我特别建议立项之前先想清楚:这个产品是给高管看指标,还是给客户经理推任务,还是给风控系统供变量?不同形态对数据粒度、更新时效、准确性要求完全不同。见过不少团队一上来就要搞“大而全”的数据平台,结果每个模块都浅尝辄止,最后连最核心的客户资产指标都算不齐。先把形态定住,后面所有技术选型才有依据。

从原始数据到可复用资产:数仓与数据治理

2.1 数仓分层:数据产品的稳定地基

金融数据产品最怕的就是“地基歪了”,而地基就是分层数仓模型。业内比较常用的四层结构是ODS、DWD、DWS、ADS。ODS贴源层原样接入各业务系统的数据,保留最原始的交易流水、账户快照、产品持有表,原则上不做太多加工;DWD明细层按业务过程做清洗、去重、标准化,比如把不同系统的客户编码映射成统一客户ID,把金额统一折算成标准币种,把时间统一到同一时区;DWS汇总层按客户、产品、渠道、机构等维度做轻度聚合,沉淀高频使用的指标,比如客户月日均AUM、交易频次、产品持有数;ADS应用层则面向具体场景组装数据,生成客户画像宽表、风控变量集、经营日报数据源。

分层的价值在于职责单一、加工可追踪。某个指标出错时,可以快速定位是清洗环节的问题、聚合口径的问题,还是应用层逻辑的问题。我特别建议金融项目把DWD层做厚。有些团队为了省事儿,用ODS直接join出指标,短期看开发速度快,后患却很大,一旦业务定义发生变化,所有下游任务都得跟着改。把清洗、过滤、标准化的动作尽量沉淀到DWD层,后面建数据产品就是搭积木,而不是每次重复造轮子。

2.2 金融场景下的数据治理三板斧

金融数据治理,我总结成三板斧:主数据一致性、指标口径字典、字段血缘。

主数据一致性最典型的就是客户号的打通。银行里同一个客户,在存款系统、信用卡系统、理财系统可能各有各的编码,必须建立客户映射表,以统一的客户ID进入数仓。这个映射关系通常要结合身份证号、手机号、账号等多维信息做匹配,同时要处理一户多号、多人共用手机号这些边界情况。口径字典建设更偏管理问题。我说的口径字典不是挂在Wiki上没人看的文档,而是要在数据产品页面上做到“点开这个指标,能看到它的定义、计算公式、取数范围、更新周期和SQL出处”。比如AUM到底包不包含当日理财未起息的资金,这类细节必须写得明明白白。血缘关系则要落到工具里,表级血缘和字段级血缘缺一不可,哪个字段从哪张表来、经过哪些转换,要能一键查出来。血缘不只是排查问题的线索,也是做数据安全分级的基础——知道字段的来源,才知道这个字段能不能给到某个角色。

数据产品的核心加工链路:清洗、建模与可视化

3.1 离线与实时:不同时效要求的技术选型

金融场景的数据时效要求通常分三档。T+1的离线报表、批量加工和客户名单类任务,用Hive或者Spark SQL就够了,大数据量、多表关联的稳定计算是它们的强项。小时级的准实时需求,比如营销名单更新、指标监控,可以用Spark Streaming或者Flink做微批,延迟控制在分钟级。秒级的实时需求,比如实时授信、异常交易检测、反欺诈评分,就需要Kafka加Flink那套流式链路了。

但金融行业对数据一致性要求太高,很多场景不能容忍“最终一致”带来的数据对不上账。所以我的原则是:能离线就别实时,实时链路必须做对账。也就是说,实时算出的关键指标,要和离线任务算出的同一指标做每日比对,如果偏差超过阈值,必须定位是窗口问题、迟到数据问题还是计算逻辑问题。技术选型没有绝对好坏,关键是先明确业务到底能容忍多少延迟,又绝对不能容忍什么错误。实时链路看着酷,但运维成本和排查难度是指数上升的。

3.2 客户画像加工流程示例

拿一个很典型的“客户360画像”数据产品来说,它要回答:这个客户在银行到底有多少资产,偏好哪类产品,最近活跃不活跃,有没有流失风险。我来拆解一下它的加工链路。

ODS接入:从核心系统抽取账户表、交易流水表、产品持有表,从渠道系统抽取登录行为日志、手机银行操作流水。DWD清洗:对流水做去重,剔除测试交易,统一时间戳格式和金额精度,再把各系统客户编码关联成统一客户ID。DWS汇总:按客户维度聚合出近30天交易频次、交易总金额、产品持有数量、偏好渠道、月末AUM等核心指标。ADS输出:把汇总指标与客户基础信息、历史标签关联,产出客户宽表,供数据产品查询。

下面是一段简化版的Hive SQL,展示的是DWS层按客户聚合的写法:

INSERT OVERWRITE TABLE dws_customer_asset_daily PARTITION (dt = '${bizdate}') SELECT cust_id, SUM(IF(trans_type = 'SAVING', trans_amount, 0)) AS saving_in_amount, SUM(IF(trans_type = 'WITHDRAW', trans_amount, 0)) AS withdraw_amount, COUNT(DISTINCT product_code) AS product_cnt, COUNT(DISTINCT channel_code) AS channel_cnt FROM dwd_trans_detail WHERE dt = '${bizdate}' GROUP BY cust_id;

实际生产里还要考虑分区裁剪、内存调优和小文件合并。用Spark SQL跑这个作业时,我会按客户ID做分桶,控制每个分桶文件大小在128MB左右,避免后续读取产生大量小文件。另外要特别提醒,流水表按天分区,但客户聚合的结果建议按账号ID做散列分布,不然同一个客户的几百条记录可能落在不同节点,影响后续关联查询的稳定性。

3.3 让数据“看得见、点得动”的可视化设计

可视化是数据产品的外衣,但金融行业看板有自己的门道。我的设计原则是:第一,指标分层,一屏只放一个核心主题。比如客户经营看板就围绕“客户数—AUM—收入—风险”四象限展开,不要把二十个指标都堆在第一屏,看得人眼花缭乱。第二,支持下钻,从机构维度钻取到网点、到客户经理、到客户明细,让使用者能够逐层定位问题。第三,必须有对比,同比、环比、预算达成率这些锚点要放在指标旁边,否则单看一个绝对值根本判断不了好坏。第四,权限决定可见度,不同角色看到的行和列完全不一样,省得敏感数据到处飞。

工具层面,我常用ECharts做前端图表,后端用SQL或者OLAP引擎提供查询接口。但工具本身不重要,重要的是把图表逻辑和指标口径绑定。前端每个图表都必须对应一个明确的指标定义和查询模板,不要说改口径就改口径。实际项目里最常见的问题就是“图上这个数字怎么和另一个页面不一样”,通常都是不同地方分别写了一套SQL,没有统一走指标服务。

安全、权限与稳定性:金融数据产品的生命线

4.1 行级权限与字段脱敏

金融数据产品绕不开安全和合规,权限控制至少要分两层。第一层是行级权限,比如某支行的客户经理只能看本支行的客户数据,哪怕他写SQL去查全表,结果集里也不能出现其他机构的数据。第二层是字段级权限,手机号、身份证号、家庭住址这些敏感字段,对大多数角色要做脱敏展示。很多团队以为在应用层做权限就够了,其实最稳妥的做法是在数仓或中间查询层强制动态过滤。

具体实现上,我会在DWS客户表里加入数据归属org_id字段,查询时把用户所属机构列表拼进SQL的IN条件,同时通过统一的查询入口强制执行,应用端不能绕过。字段脱敏我习惯做成UDF,对手机号中间四位和证件号关键段直接打码,明文根本不落到应用层表里。这些设计必须在产品原型阶段就定好,否则产品上线后再补权限,要改底层模型、改所有接口,成本高到让人崩溃。

4.2 数据质量监控框架

数据产品的可信度来自质量监控。我搭质量检查框架时,会在每天凌晨批量任务跑完后自动执行十几项检查。主键唯一性校验,目标表主键不能重复,重复就说明上游有重复结算或者加工有Bug;记录数波动校验,当日记录数和历史均值比较,变化超过20%就报警,可能是上游源表掉了数据,也可能是join膨胀了;空值率校验,关键字段的空值率不能超过阈值,比如客户ID如果为空,整条记录基本没法用;累计指标趋势校验,像AUM日环比如果突然变化超过5%,一定是哪条链路出了问题。

这套框架的核心是提前于业务人员发现异常,而不是等问题被业务投诉了再救火。每张核心表都要有owner,每条质量规则都必须写明责任人和历史基线。我还会把质量检查结果落库,方便复盘每周的失败情况。数据产品的用户一旦被不靠谱的数字坑过一次,后面很难再建立信任,所以质量监控不是可选项,是生命线。

4.3 调度依赖与任务预警

调度系统看着不起眼,却直接决定数据产品的SLA。金融环境里一条数据产品链路往往有几百个依赖节点:上游核心系统接口延迟、Kafka堆积、下游任务并发碰撞,任何一个环节抖动都会拖垮整条链路。我的做法是:用DAG调度工具管理任务依赖,明确校验任务之间的先后顺序;每天首跑时间尽量错峰,别让所有任务都挤在整点;每个任务设置超时阈值和重试次数,并且对核心产品增加“就绪检测”——数据生成后先跑一遍核心指标,检测通过才允许开放给用户查询。

这些年处理过的数据事故里,很多不是计算逻辑写错了,而是任务依赖配置错了。最常见的是漏配了依赖,导致下游任务在上游还没跑完时就读取半成品数据,生成一张所有数字都是错的表。这种问题光靠人眼盯是盯不住的,一定要靠调度状态和就绪检测来卡。

落地过程中的常见问题与排查技巧

5.1 指标口径对不上怎么办

“报表里AUM和月末余额对不上”是我被问过最多的问题,没有之一。排查思路分三步。第一步,看两边的指标定义是否一致,一个可能算的是敞口余额包含未结息部分,另一个可能剔除了当日发生又当日平掉的交易。第二步,看时间口径是否一致,一个取自然日,一个取工作日;一个取日终快照,一个取日内峰值。第三步,看跨系统数据源是否一致,核心系统出的余额和数仓加工的余额,可能在记账时点上本来就有差异。

我解决这类问题的根本办法,是把指标口径字典数字化。每个指标绑定一个表达式、一张样例数据和一段可执行的SQL,数据产品页面上每个指标都能追溯到定义和出处。团队内部有个死规矩:新指标上线前,必须拉着业务和数据负责人一起签字确认口径,白纸黑字落到文档里,不然上线后就是无穷无尽的扯皮。

5.2 数据延迟导致报表“空窗”

数据延迟往往不完全是数据产品团队能控制的,上游系统接口超时、源库性能抖动、网络波动,都会让当天数据晚点。我在设计调度的时候,会给核心链路多留缓冲时间,并且使用上游就绪检查:先确认上游表和接口数据文件都完整到位,再启动加工任务。如果确实晚点超过了服务承诺的SLA,宁可让页面显示“数据准备中”,也不能推半成品数据出去。金融业务是拿数字做决策的,错误数字比没有数字更可怕。很多业务方看到“数据准备中”虽然会烦,但至少不会用错数据去做后续动作。

5.3 资源争抢与慢任务治理

金融数仓集群上,ETL、报表查询、临时取数争抢资源是常态。有次客户经营报表突然变慢,查了半天发现是有个同事跑了一条全表扫描的临时SQL,把YARN队列的资源占满了。后来我做了三件事来治本:按任务优先级划分YARN队列,核心报表走高优队列;临时查询强制设置超时和扫描上限,超大任务直接拒绝;对核心表做分区和分桶设计,鼓励所有查询走分区裁剪。这一套组合拳打下来很有效,核心报表的查询耗时从十几分钟降到几秒钟。记住,在金融数仓里资源治理不是运维的事,是数据产品体验的一部分。

5.4 数据质量事故的排查路径

遇到数据质量投诉,我的排查顺序很固定:先还原场景,问三件事——这个数据是哪个任务产出的?这个任务今天跑的日志有没有异常?数据对比的基准期是不是选对了?然后做数据层面的快速体检:对客户表对比今天的count、sum、distinct数和昨天的差异;再看异常记录是不是集中在某些业务线或机构。通常按这个顺序能定位八成的问题。千万别一上来就翻代码,先看数据“病在哪个部位”,再顺着血缘去找加工逻辑。代码级排查很费时间,而大部分质量问题的根源无非是上游数据缺失、重复记录或者类型转换错误。

对我来说最重要的几条实战经验

6.1 上线前别急着炫技

给金融客户做数据产品,我踩过最大的坑就是过度设计。一上来就想搭实时数仓、上机器学习平台、搞图数据库,结果业务方连T+1的报表都还没用明白。现在我的习惯是:先跑通一条核心指标链路,让业务每天看到稳定的数字,建立信任;再逐步叠加实时指标和算法能力。数据产品在金融行业不是技术秀场,它是帮业务赚钱和避险的工具,稳定比新颖值钱得多。有个老领导说过一句让我记到现在的话:金融系统里,99%的时间在维护那1%的异常。这话放在数据产品上一样成立。

6.2 定期做数据体检

除了日常监控,我会每季度组织一次“数据体检”,把核心表的存储膨胀率、任务失败率、数据空值率、口径文档覆盖率全部拉出来看一遍。数据体检查出来的问题,往往比业务投诉更早浮现。比如某张流水表的分区字段类型从string变成了int,导致下游关联全部失效,就是因为没有定期检查元数据变化。体检模板我放在团队里共享,谁都可以跑,跑完自动生成一份带打分的报告,列出风险项和责任人。这比每次都靠业务投诉来驱动改进,省心得多。

6.3 后续值得关注的扩展方向

如果T+1的数据产品已经跑得很稳,下一步可以尝试实时指标服务、客户行为序列分析、关系网络分析。金融场景里,关系网络能辅助识别资金往来圈和风险传导路径,行为序列能支撑更精准的产品推荐。但这些扩展都依赖更完善的基础数据治理,尤其是主数据质量和标签覆盖度。我自己最近的体会是,越往上层的应用越想做出彩,越要在底层数据上多花笨功夫。先把地基打扎实,再谈智能化,这可能是金融数据产品最朴素也最实用的逻辑。

返回列表