ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据清洗怎么干:从数据治理到数字化转型的底层逻辑

数据清洗怎么干:从数据治理到数字化转型的底层逻辑 1. 先聊清楚一件事数据清洗不是洗数据这么简单做大数据这行这些年我见过太多企业对数据清洗的理解停留在字面意思上——以为就是写几个脚本把空值补一补、格式统一下、重复记录删一删这事儿就算完了。结果呢清洗报告做得漂漂亮亮业务部门照样不买账领导看数据大屏还是觉得这数不对。问题出在哪儿出在很多人没搞明白一个关键点数据清洗在数字化转型里从来不是一个孤立的技术环节而是整个数据价值链的起点和底座。先说个我亲历的场景。前几年给一家连锁零售企业做数据中台项目他们的会员系统、POS系统、线上商城、CRM四套系统里的用户数据同一个客户可能有四个完全不同的ID和手机号格式。当时团队里有个新人吭哧吭哧写了三天Python脚本去清洗这些数据把手机号格式统一了、身份证号校验了、空值补上了然后兴冲冲地跑过来告诉我数据干净了。我问他你清洗完之后这个客户到底是男是女在哪个城市消费能力怎么样他愣住了——因为这些信息分散在四套系统里光做字段级别的清洗根本没把数据打通更谈不上理解。这就是我要讲的第一件事数据清洗推动企业数字化转型推动的不是数据变干净这个动作而是让数据从可用变成可信、可用、可驱动决策。如果清洗完的数据还是各表各说、语义不一致、粒度不统一那下游不管是做报表、跑算法还是上数据中台全都白搭。另外要说清楚的是数据清洗在大数据领域的地位这几年其实发生了很大变化。早期大家讲大数据核心词是存储和计算Hadoop刚火那会儿能搭起一个集群、跑通MapReduce就觉得挺牛了。现在不同了数据量早就不是瓶颈瓶颈在于数据质量。你去面试大数据岗位Spark、Hive、Flink八股文背得再溜一问到数据质量怎么保障脏数据怎么治理很多人立刻露怯。培训机构教的大数据学习路线里数据清洗要么一笔带过要么当成pandas的一个入门章节这完全是本末倒置。我自己这些年做数据项目的体会是一个数据团队60%以上的精力其实都耗在数据清洗和数据质量上真正写分析模型、做算法的时间不到20%。这不是团队能力不行而是现实本来就如此——业务系统在跑、日志在产生、外部数据在买进数据永远在变脏。谁能把清洗这件事做得又快又好、还能沉淀成体系谁家的数据底座就扎实数字化转型的步子就迈得稳。这篇文章我就想结合自己在大数据项目里的实际经验把数据清洗这件事掰开揉碎了讲清楚为什么它这么关键、脏数据到底从哪儿来、清洗流水线该怎么搭、工具怎么选、和治理的关系怎么理顺、最后怎么才能让清洗真正产生业务价值。我不讲虚的全是实操层面踩过坑之后的总结。2. 脏数据到底是怎么来的数字化转型路上最隐蔽的绊脚石很多企业上数字化转型项目第一反应是上系统、上平台、上大屏总觉得数据问题嘛技术解决了就行。但真到数据汇集上来那一刻才发现情况远比想象中复杂。我自己服务过的甲方几乎没有一个能拍着胸脯说我们源系统的数据是干净的。脏数据不是某个企业独有的问题而是所有数字化转型项目的共性难题。2.1 源系统层面的历史包袱先说最常见的一类历史数据的老化与不一致。很多传统企业的核心业务系统是十年前甚至二十年前上的用的是老旧的数据库架构字段设计完全围绕当时够用来搞。比如某制造企业的ERP系统里订单状态这个字段有的是用数字存的1代表未处理、2代表处理中有的是用中文存的未处理处理中甚至同一个系统里不同模块还在混用。数据清洗的时候光统一这个字段的编码规范就得先翻完几十页历史文档再找几位老员工确认当年每个编码的真实含义。这种问题最头疼的地方在于它不是技术问题而是历史知识问题。清洗团队如果没有业务专家介入很容易把状态映射搞反导致下游报表全部出错。我们当时做招聘数据清洗的MapReduce实验时也遇到过类似情况——几十万条简历数据学历字段有的写本科、有的写大学本科、有的简写成本、还有的干脆写成BBachelor。这种同义不同值的状态光是枚举和映射就得梳理很久。2.2 业务系统之间的语义鸿沟第二个重灾区是跨系统的语义不一致。现在的企业几乎没有哪家是靠一套系统跑完全部业务的。线上商城一套、线下POS一套、会员管理一套、财务一套、仓储一套系统之间数据标准不统一是常态。最典型的就是客户标识A系统用手机号做主键B系统用会员卡号C系统用身份证号D系统用微信OpenID。同一客户在四套系统里从数据角度看就是四个人。这种问题在网约车大数据综合项目里表现得特别明显。出行数据、订单数据、GPS轨迹数据、司机信息数据分属不同数据源时间格式有的是Unix时间戳、有的是yyyy-MM-dd HH:mm:ss字符串、有的还带时区偏移。做基于Spark的数据清洗时第一步就得先统一这些异构数据的格式和口径否则后面做路段分析、订单匹配、运力调度结果全都不靠谱。我常跟团队说一句话技术上的脏数据都不难清难的是业务口径不统一的脏数据。因为后者没有普适的清洗规则必须逐项跟业务确认。数字化转型如果没在源系统层面推动数据标准化清洗环节做多少都是救火而非防火。2.3 采集与加工环节引入的二次污染还有一类脏数据是数据在采集和加工过程中被弄脏的这个责任完全在我们大数据团队自己身上。比如日志采集链路丢数据、Kafka重复消费导致数据重复、ETL脚本里类型转换截断导致精度丢失、Hive分区字段取值不规范导致数据错位……这些技术层面的问题每一个我在实际项目里都踩过。举个具体例子。有次做网约车数据分析项目上游日志上报的经纬度字段正常应该是纬度,经度的顺序但有个版本客户端发出来的是经度,纬度。结果清洗时没发现下游画出来的城市热力图全部镜像了业务方盯着图看了半天觉得不对最后排查了两天才定位到这个源头问题。这就是典型的加工引入的二次污染——数据本来没错是我们处理链路里埋了雷。所以说做数据清洗不只是洗数据本身还要洗数据采集链路、洗加工逻辑、洗调度依赖。一个完整的数据清洗体系必须覆盖数据从产生到消费的全链路而不是等到数据入了数仓才开始做质量把关。3. 一套能落地的数据清洗流水线从探查到验证的闭环设计讲完了为什么脏和为什么重要接下来说点实在的一套能落地的数据清洗流水线到底应该怎么搭。我见过不少团队清洗全靠临时写脚本需求来了写一个下回数据变了再改一版永远在打补丁。这种方式在数据量小、业务简单的阶段还行一旦进入数字化转型深水区数据源几十个、日增量上亿条没有一套规范化流水线根本撑不住。3.1 第一步数据探查别一上来就动手写清洗逻辑很多新人最容易犯的错就是拿到数据没做探查凭感觉先写几个清洗规则跑完发现结果不对再反复调整。正确姿势是先做数据质量探查把数据的脾气摸清楚再动手。数据探查至少要看几个维度完整性每条记录的关键字段是否存在缺失率是多少。比如用户数据里手机号缺失率达到30%那后续做用户画像就基本无从谈起。唯一性有没有重复记录重复率多高。网约车订单数据里如果同一订单在ODS层被重复采集后面算GMV就多算一倍。合法性字段值是否在合理范围内。比如年龄字段出现负数、经纬度出现在海洋中间、金额字段出现小数点错位这些都是合法性校验要管的。一致性同一条记录在不同表、不同系统里的同一字段取值是否一致。有效性值是否符合业务规则。比如订单状态字段的值是否都在枚举列表内。做探查的工具有很多数据量小用pandas做describe、value_counts就够数据量大就得靠Hive、Spark跑统计SQL或者用专业的元数据与数据质量工具。我这边习惯的做法是先写一套标准探查SQL模板每个新接入的数据源都跑一遍把质量报告导出归档到数仓元数据库里。这样后续每次清洗完还能对比质量前后变化用数据说话。实际项目中数据探查往往能出一些反直觉的发现。比如我们之前做招聘数据清洗实验探查时发现工作经验年限这个字段居然有大量记录写着3年和3年以上并存还有同一家公司的不同岗位公司名称有的带有限公司后缀、有的不带。这种问题单看数据肉眼根本发现不了必须靠系统的探查流程才能暴露。3.2 第二步清洗规则设计从事后补救到事前定义探查做完接下来的核心工作是设计清洗规则。这一步最考验经验因为规则不是越多越好而是要精准命中问题、可解释、可回滚。一套规范的清洗规则集我一般会分成这几类规则类型处理对象典型案例格式标准化字段格式统一手机号去空格、日期转统一格式、性别值映射缺失值处理空值、NULL值均值填充、众数填充、业务默认值、剔除记录重复值处理重复记录识别同一客户多ID合并、订单号去重异常值处理超出合理范围的值年龄大于120、金额小于0、经纬度越界逻辑校验字段间逻辑矛盾下单时间晚于支付时间、未婚且有配偶编码映射不同体系编码统一状态字段1/2/3与未处理/处理中/已完成映射很多人纠结缺失值到底该不该补、怎么补。我的经验是先分清字段类型和业务用途。比如用户画像里的职业字段缺失了做聚类分析时可以当作未知单独成一类而不是硬塞一个其他进去掩盖问题但手机号缺失了如果这个字段是下游短信营销的主键那缺失记录只能剔除。填充方式没有放之四海皆准的答案关键是想清楚下游拿这个字段干什么用。这些规则的沉淀方式建议不要只写在脚本里而是要逐步固化成语义化的配置比如用JSON或YAML描述规则集让清洗任务可配置化。这样数据源变更时只改配置不写代码团队其他人也能读懂和维护。我们后来在数仓项目里就是把几百条清洗规则全部配置化配合调度系统每天自动跑运行状态一眼可见。3.3 第三步清洗执行分布式引擎选型与任务编排规则定好了执行层怎么选这块得分数据量级来说话。小数据量GB级以下的探索性分析pandas就非常趁手。pandas做数据清洗的体验确实好链式操作写起来流畅调试也方便。我在项目初期都喜欢用pandas先快速验证清洗规则是否符合预期确认有效之后再迁移到大数据引擎上跑全量。大数据量TB级以上或者需要周期性调度那就要上Hive、Spark这类分布式引擎。我们在网约车大数据项目里用的就是Spark配合Hive数仓来做清洗调度。Spark的优势在于内存计算快适合复杂的转换逻辑Hive则适合做分区管理、命名规范沉淀。两者结合其实就是**ODS层用Hive做主存储DWD层用Spark做清洗加工**的经典分法。清洗任务本身要跑得稳还得做好两件事一是任务幂等性——同一批数据无论跑几次结果都要一致这是靠上游分区按天隔离、写入用覆盖模式保证的二是断点续跑——清洗链路里某个环节挂了能快速定位并从失败位置继续不必整条链路重跑。这两个点不解决清洗任务在规模大了之后一定出乱子。3.4 第四步质量验证与反馈闭环清洗要不要回炉得有个标尺清洗不是一次性的数据源一直在更新清洗效果必须持续监控。所以流水线的最后一步是建立质量验证机制。我们当时做的框架是前后对比规则抽验双轨并行。前后对比就是清冴前先跑一遍探查SQL记录质量指标清洗完再跑一遍对比缺失率、重复率、异常值占比的变化所有指标自动记录到质量看板里。规则抽验则是针对关键规则写断言比如清洗后手机号字段不应存在非数字字符清洗后订单金额必须大于0每天跑完任务后自动断言失败就告警通知值班人员。这个验证环节特别重要因为有相当一部分清洗规则是有副作用的。比如你去重如果去重逻辑写得不严谨可能把一个客户名下的多笔订单全删了只留下一条——订单数据可不是客户主数据不该这么去重。类似这种问题如果只有清洗没有验证数据就死得不明不白。反馈闭环的意思是下游使用数据时发现的异常要能逐层回溯到清洗环节反过来修正清洗规则。这块做扎实了清洁流水线才真正算是闭环。4. 工具链与选型经验pandas、Spark、Hive怎么配合才高效聊完流水线再展开说说工具选型。这也是后台有朋友反复问的问题我刚学大数据是先学pandas还是先学Spark我们公司集群不大清洗用Hive还是Spark这些问题没有统一答案但背后确实有规律可循。4.1 pandas的价值探索与分析别拿它硬撑全量数据pandas在数据清洗里的定位我个人给它总结为三个词快、活、狠。快是上手快、出结果快活是表达灵活各种奇奇怪怪的清洗逻辑都能写狠是指数据分析能力确实强groupby、merge、apply组合起来能快速验证各种假设。我在上文中提到新接入的数据源我都会先用pandas做探查分析。一条包含几百万行的CSVpandas读进来做聚合、做字段分布统计也就几秒钟到几十秒的事。这种速度在调规则阶段是关键的——你改一版规则马上就能看到结果变化迭代效率极高。但pandas的局限也很清楚单机内存有限几亿行数据就力不从心了分布式能力等于零跑不了大规模周期任务任务调度、状态管理这些运维能力也要靠外部系统补齐。所以pandas在项目中的位置应该是侦察兵而不应该是主力部队。我见过一些团队硬拿着pandas做千万级日增数据的批处理结果动不动OOM还弄得代码又长又脆这纯属用错了工具。4.2 数据量大怎么办Spark做清洗是当前最顺手的选择当数据量跨过单机内存的上限或者清洗任务需要支撑7×24小时周期调度就该引入分布式计算引擎了。现在的大数据技术栈里做清洗任务用得最多的还是Spark。Spark做清洗的好处首先是吞吐量高内存计算和DAG执行模型让它在复杂转换场景下明显快于Hive MR任务。其次是API表达力强DataFrame API简直是pandas风格大数据版从pandas迁移过来成本很低。很多从Python数据分析转型做Spark的朋友基本一周就能上手。当然用Spark做清洗也有要特别注意的坑。第一资源参数不会调集群再大也白搭——executor内存、分区数、并行度这些配置要结合数据量反复试不是复制网上模板就完事的。第二Spark SQL和DataFrame API混用时要小心空值处理逻辑的差异null在Spark里有三值逻辑过滤条件写不对很容易把有效数据也滤掉。第三Shuffle是性能杀手join、groupBy之前尽量先做过滤和裁剪reduce端数据量小一截任务时间能快好几倍。4.3 Hive的定位ODS层与数仓底座别指望它干精细活现在很多大数据团队说我们用Hive做数仓其实说的不是同一件事。我的理解里Hive的强项是大规模数据的存储管理、分区规范、SQL化查询它在数据清洗链条里的定位更多是承担原样接入和基础加工的角色——ODS层数据落地用Hive表管理DWD层部分简单的过滤、转码也用Hive SQL搞定只有遇到复杂逻辑才下推到Spark处理。为什么不用Hive承担全部清洗原因有二一是Hive基于MapReduce的执行模型在复杂清洗逻辑下性能不理想尤其是需要多表join和子查询的时候跑起来慢得让人着急二是Hive SQL表达复杂过程逻辑的能力有限清洗规则里有大量的条件分支、正则抽取、udf逻辑写Hive SQL会异常痛苦。反过来Spark处理完后落到Hive表下游分析、报表、算法读取就方便多了。这其实是一个各取所长的分工Hive管存、Spark管算、pandas管探索。三个工具组合在一起清洗这条链路基本就顺了。4.4 那一天我们如何选型从项目实际情况出发的经验总结做技术选型最怕的就是因为热所以用。我自己的判断框架核心就三条看数据规模日增量千万条以下单机加pandas够用上分布式反而增加运维成本。日增量亿条级别不上Spark根本扛不住。看团队能力团队熟悉SQL不熟悉编程的优先用Hive SQL团队有Python/Scala基础Spark上手更快。看下游需求下游是深度学习平台、算法团队Spark输出的特征化结果更受欢迎下游是BI报表Hive表配合预设好的指标口径最省事。大数据集群部署策略这块很多初创团队一上来就追求大而全的集群三台机器堆上十几个组件最后资源全耗尽任务都跑不动。我自己的建议是先做小规模、聚焦核心链路的轻量集群比如HDFSYARNSparkHive四件套起步把清洗、数仓、分析跑通再根据需求扩展组件。数字化转型项目里活下来并产出价值比组件大全重要得多。5. 数据清洗与数据治理为什么只做清洗不做治理等于没做很多企业做到第三步发现清洗流水线搭好了质量看板也好看了但是新的问题又来了数据质量好了一阵子过了两周又变差了A部门清洗完的数据B部门拿过去还在吐槽质量不行。问题的症结在于——清洗是治标治理才是治本。5.1 从清洗到治理建立数据标准和归属责任体系清洗解决的是已产生的脏数据该怎么处理治理解决的是如何让脏数据不再产生。没有治理的清洗永远在陪跑。落到实际工作里治理层面有几件事必须做而且是清洗团队和业务团队一起做数据标准定义全公司统一的核心字段清单、编码标准、格式规范比如性别只有male/female或1/0两种标准写法日期统一用ISO8601金额精度统一到小数点后两位。这个标准一定是以公司级正式文件形式发布而不是技术团队内部约定。数据责任人制度每一项核心数据都要明确owner——业务系统谁产生的、质量谁负责、修改谁来审批。数据出了问题不扯皮找得到人。主数据管理客户、供应商、产品、员工这些企业核心主数据要有统一的唯一的ID体系和管理流程。我们做清洗时最头疼的一个客户四个ID的问题只有在主数据层面解决靠清洗只是缓解。现在不少开源大数据方案里也在提行、列权限设计这其实是治理环节里的重要一part。数据清洗和权限治理看起来不搭边实际上关系密切——因为权限设计确定的是谁能看到什么数据数据清洗确定的是数据该以什么姿态被看到两者共同决定了数据的可信度和安全性。5.2 元数据与质量度量给数据清洗装上仪表盘数据治理要落地光靠制度和文档不行得有工具承载。元数据管理和数据质量度量就是治理的技术抓手。先说元数据。元数据是关于数据的数据比如表的归属、字段的含义、数据的来源、最近一次更新的时间、清洗规则的配置信息等。有了元数据管理系统数据字典、影响分析、血缘追踪才能做起来。我自己的经验是清洗团队必须把每条清洗规则的业务含义和技术逻辑记录到元数据系统里不然半年之后回来看自己写的规则都看不懂。再说数据质量度量。质量指标不是定几个KPI就完了而是要形成一套可持续计算、可趋势对比的度量体系。从前面的探查指标里选出最关键的几个落到质量看板上按周、按月追踪变化。哪个月份某个数据源的缺失率突然上升看板曲线会直接暴露出来不用等人去报告数据好像不对。这块做得好清洗就不再是出了事再擦屁股而是变成一件能够提前预警、持续优化的常规运营工作。5.3 全链路数据血缘让清洗规则打开天窗说亮话要我再强调一个治理层面对清洗最有价值的事就是构建数据血缘。血缘追踪解决的核心问题是这个数字是怎么算出来的中间经过了哪些清洗环节如果数据出问题该找谁、该改哪一环节尤其在数字化转型项目里业务领导看数据大屏的时候经常会问这个指标为什么不等于财务那边报的数。没有数据血缘这种问题只能靠技术人员翻代码去查既慢又容易错。有了血缘图谱从报表指标一路追溯到源系统埋点中间每一次清洗、加工、聚合都清清楚楚问题定位时间能从小时级降到分钟级。血缘信息怎么来一方面是ETL调度系统在任务执行时自动记录血缘关系另一方面是依赖元数据系统里对表字段的语义描述。现在主流的商业和开源数据平台基本都支持血缘能力关键是要从一开始就建立这个习惯而不是等数据体系庞大了再补。6. 从清洗到价值数据质量如何真正驱动业务改善与数字化转型说了这么多技术层面的东西最后落到一个灵魂拷问清洗了半天数据业务价值到底体现在哪儿答不上来这个问题数据团队在公司里的位置就永远是修水管的。6.1 场景一建立同一客户的准确视图精准营销和风控才有地基接回我很早举的零售企业案例。当时我们把四套系统里的客户数据清洗打通建了统一客户视图Customer 360业务的直接反馈是营销活动发短信的成本下降了30%因为之前同一个人会被不同系统重复触达清洗后触达次数被合理控制。更重要的改变是客户画像里性别不明的比例从之前的18%降到了不到2%营销内容的匹配度明显提升打开率和转化率都好看很多。这个例子很能说明问题清洗这件事做的事情是把看起来差不多其实很乱的数据变成业务可以直接信任的数据。数据一旦被信任业务部门才会愿意用它做决策数字化转型才算真的跑起来。6.2 场景二统一指标口径让管理层看到真实的数字数字化转型有个非常常见的堵点董事会看一个营收业务线、财务、数据部门各算各的数字对不上会议变成一个扯皮现场。背后原因往往就是底层数据的口径不统一——有的是含税、有的是不含税有的按合同确认收入、有的按现金到账确认有的是当日订单汇总、有的是滞后一天T1汇总。这种口径问题的解决表面上是指标定义问题底层靠的还是清洗和数据标准化——把订单状态、日期维度、金额口径字段清洗到位再配合指标管理系统把口径固化下来才能实现一个公司只有一个财务数字。6.3 场景三为AI算法提供干净燃料模型效果才能提上来大数据行业这几年最大的变化就是AI和机器学习的应用开始真正落地。做用户推荐、销量预测、风控评分这些通通离不开高质量的数据。算法工程师经常抱怨数据太脏、特征没法做但问题的根源往往不在算法本身而在上游数据没清洗干净。举个典型的例子做销量预测如果历史订单里的异常值和退货记录不做清洗模型会把异常促销冲高和真实需求混在一起学预测结果忽高忽低。做了清洗和特征工程后模型稳定性会明显提升。所以我自己一直觉得数据清洗做得好的团队才是真正在给AI铺设可靠跑道的团队。7. 写在最后数字化转型成败首先要看数据底座稳不稳这些年见过太多数字化转型项目有的气势恢宏做大屏、做中台最后交付了却没人用有的一开始很低调先把数据治理和清洗做扎实一年后再看业务部门的数据应用已经遍地开花。区别不在于谁的预算多、谁的架构先进而在于谁把数据的可信这件事真当回事了。我个人在实际项目中最大的体会是给一个企业做数字化转型最吃力不讨好的往往是数据清洗——它不像数据大屏那样有视觉冲击力不像算法模型那样有高科技感但它是一切上层建筑的地基。地基不牢上面建什么都白搭地基打好了后面每一步都走得踏实。最后再分享一个小技巧做数据清洗项目的汇报别总讲我们清了多少万条脏数据缺失率降低了多少个百分点这些数字对业务领导来说感受不直观。要讲清洗之前的营销活动成本和清洗之后的变化要讲之前报表对不上账的耗时和现在实时对齐的体验。把数据质量翻译成业务语言清洗工作才能在整个组织里获得真正的重视和资源支持。这一点比任何技术细节都重要。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进