一文讲透数据清洗流程与10大核心规则
很多人理解的数据清洗,就是:
空值补一下、重复数据删一下、日期格式统一一下。
真正做过企业数据项目以后就会发现,数据清洗最难的其实不是“怎么改”,而是:
- 什么数据应该改?
- 应该改成什么?
- 改完以后怎么证明没有把正确的数据洗错?
同一个空值,可能代表“用户没有填写”,也可能代表“这个业务场景本来就不适用”;订单金额突然出现负数,可能是脏数据,也可能是一笔退款;两个客户姓名、手机号完全一样,也不能直接断定一定是重复客户。
所以数据清洗真正解决的,不只是格式问题,而是把原始数据一步步处理成:
结构统一、含义明确、逻辑合理、能够追溯、可以被下游稳定使用的数据。
如果你最近正好在做数据治理、数据集成或者数仓建设,可以先把这份《数据仓库建设解决方案》存下来,里面整理了不少数据架构、治理以及实际项目资料,后面梳理清洗规则时也能作为参考。
下面就把数据清洗到底怎么做,一次讲透。
一、数据清洗之前,先判断数据到底“脏”在哪里
企业里的数据问题,大致可以分成四层。
第一层是结构问题。
同一个客户编号,在CRM里叫 customer_id,ERP里可能叫 cust_no;一个系统日期是 2026-09-22,另一个系统却是 09/22/2026。
单独看都没有错,放到一起就无法直接使用。
第二层是内容问题。
空值、重复值、多余空格、乱码、大小写混乱、异常字符,都属于这一层。
第三层是业务逻辑问题。
下单时间晚于付款时间、员工离职日期早于入职日期、订单状态已经关闭但未结金额仍然大于0。
这些数据的数据类型甚至完全正确,但业务上解释不通。
第四层是跨系统一致性问题。
CRM里的客户等级是A,ERP里却是B;商品主数据已经停用,交易系统却还在继续产生订单。
所以清洗之前最好先形成一张:
问题 → 判断规则 → 处理动作 → 责任人 → 验证方式
的清单。
这也是为什么实际项目里,清洗往往要跟数据集成一起考虑。不同数据库、接口、文件进入 FineDataLink 5.0 后,可以继续进行过滤、字段处理、转换和映射,把不同来源之间最基础的结构差异先统一掉。
这样后续的数据质量规则面对的就不是一堆完全不同的原始格式,而是一套相对稳定的数据结构。
二、一套完整的数据清洗流程,至少要走5步
很多项目一上来就开始写SQL。
结果半年以后,没人知道某个字段为什么被改成了现在这个值。
更合理的顺序应该是:
第一步:数据画像。
先统计字段类型、空值率、重复率、唯一值数量、最大最小值、数据分布以及异常值占比。
先回答:
问题到底发生在哪里?影响了多少数据?
客户手机号缺失0.1%,和缺失40%,显然不是同一个问题。
第二步:定义规则。
把业务要求转化成机器可以判断的条件。
客户ID不能为空、订单号不能重复、折扣率必须在合理范围、付款时间不能早于下单时间……
这一步实际上是在定义:
什么叫“正确的数据”。
第三步:执行处理。
根据规则做过滤、替换、标准化、补齐、映射、拆分、合并、类型转换和去重。
第四步:异常隔离。
无法确定的数据不要直接删除。
更稳妥的方式,是把它们放进异常区,同时记录原始值、来源、异常原因和发现时间。
第五步:重新验证。
重新检查空值率、重复率、异常率、记录总数以及关键业务指标。
因为程序执行成功,只能证明任务跑完了。
不能证明数据真的洗对了。
三、真正实用的数据清洗,要掌握这10条核心规则
- 空值处理:先判断“空”代表什么
NULL、空字符串、0、“未知”、“N/A”,不能简单视为同一种状态。
销售额为0,表示确实没有销售;
销售额为NULL,则可能表示数据根本没有采集到。
所以空值通常有四种处理:
补齐、保留、过滤、进入异常区。
能不能补,关键看有没有可靠依据。
能根据城市编码反推出省份,可以补;客户生日没有任何来源,就不要凭平均值硬填。
- 重复数据:先定义业务主键,再谈去重
最危险的去重方式,就是直接:
DISTINCT
因为技术上完全相同,才叫“行重复”;业务上的重复往往复杂得多。
客户可能按照手机号+证件号判断;
订单按照订单号判断;
用户行为可能需要:
用户ID + 行为类型 + 时间戳
共同判断。
发现重复以后,还必须继续确定:
保留最新、保留最早、按照来源优先级保留,还是合并字段?
所以去重真正难的,是业务身份识别。
- 格式标准化:让“同一个东西”真正变成同一个值
北京
北京市
BEIJING
如果没有统一规则,在计算机眼里就是三个不同的值。
日期、地址、手机号、币种、计量单位、大小写都存在类似问题。
格式标准化本质上是在解决:
同义不同值。
- 数据类型转换:转换失败必须有去处
字符串 "100" 可以转换成100。
那 "100元"、"-"、"未知" 怎么办?
生产环境里不能只考虑转换成功的数据,还要提前定义:
失败以后置空、保留原值、终止任务,还是进入异常表。
否则一条异常记录就可能让整批任务失败。
- 文本清洗:小字符也会制造大问题
首尾空格、换行符、不可见字符、全角半角、大小写差异,经常会造成:
肉眼看起来一样,系统判断却不相等。
而且很多企业并不是一张表存在这种问题,而是几十张表、几百个字段反复出现。
这时候如果每条任务都重新写一遍替换逻辑,规则很快就会失控。FineDataLink 5.0 里可以维护全局清洗规则,让存在同类问题的字段引用统一规则,后面规则发生调整时,也不需要重新翻大量任务逐个修改。其数据管理模块本身也把全局清洗规则作为独立能力管理。
- 枚举值校验:防止业务状态悄悄失控
假设订单状态只有:
待支付、已支付、已发货、已完成、已关闭。
某天突然出现:
成功
不能简单替换成“已完成”。
因为它可能意味着上游系统新增了状态,也可能意味着接口映射出了问题。
枚举校验首先负责的是:
发现未知值。
确认含义以后,再决定映射还是修正。
- 范围校验:异常值不等于错误值
年龄300岁,大概率有问题;
订单金额100万元,却未必错误。
所以范围检测可以把数据分成:
确定非法、值得关注、正常。
真正成熟的规则不会把所有离群值直接删除,而是根据业务风险设置不同处理级别。
- 关联完整性:避免产生“孤儿数据”
订单里的客户ID,应该在客户主表中存在;
商品明细里的商品编码,应该能找到对应商品;
员工记录里的部门ID,也应该对应有效组织。
如果事实数据找不到对应主数据,就会形成大量“孤儿记录”。
这一类问题靠单表清洗通常发现不了。
- 业务逻辑校验:从“字段正确”走向“业务正确”
真正复杂的问题往往发生在字段之间。
比如:
下单时间 ≤ 支付时间 ≤ 发货时间
或者:
实付金额 = 商品金额 + 运费 - 优惠金额
每个字段单独看都合法,但组合以后可能完全矛盾。
所以清洗做到后面,检查对象必须从:
一个字段
逐渐走向:
多个字段、多个表甚至一整个业务流程。
这里其实已经开始进入数据质量管理。FineDataLink 5.0 的数据检测可以围绕唯一性、完整性、字段格式、枚举值等设置检测规则,还能记录部分检测失败后的异常明细。
这样清洗规则负责“怎么处理”,检测规则继续回答“处理完以后还有多少问题”,两者分开以后,整条链路会更容易定位问题。
- 敏感数据处理:干净不代表可以随便用
手机号、身份证号、银行卡号、详细地址等字段,即使数据完全准确,也不能直接进入所有下游环境。
数据进入测试、开发、分析或者外部共享场景以前,还需要根据使用目的进行:
脱敏、加密、隐藏或者权限控制。
所以数据清洗最后处理的已经不只是“正确性”,还包括数据的使用边界。
四、清洗规则最好分三层,不要全塞进一段SQL
很多企业的数据清洗后期越来越难维护,核心原因就是:
所有逻辑都堆在一个任务里。
更清晰的方式,是拆成三层。
第一层是技术标准化:
字段类型、格式、编码、空格、字符、单位统一。
第二层是数据质量处理:
空值、重复、枚举、范围、完整性。
第三层是业务规则处理:
订单状态、客户关系、指标逻辑、跨系统一致性。
这样以后出现问题,才能快速判断:
到底是原始格式错了、质量规则出了问题,还是业务口径发生了变化。
否则一段几千行SQL运行半年以后,往往没人敢修改。
五、数据清洗之后,一定要再建立一道“质量门禁”
数据清洗最危险的情况,不是任务直接失败。
而是:
任务成功了,但数据被洗错了。
所以清洗后的数据进入数仓、报表或者AI分析以前,至少应该重新检查:
空值率、重复率、格式正确率、异常值占比、记录数变化,以及关键金额、订单量、库存量等业务指标。
这里还应该给不同规则设置不同等级。
客户ID重复、财务金额不平,这类问题可以直接阻断下游;
非核心备注字段出现少量空值,则可以先预警,再安排治理。
FineDataLink 5.0 的数据检测也区分了强规则和弱规则:强规则不通过会影响最终检测结果,弱规则则可以用于预警类问题。把这种思路放进清洗体系里,数据质量就不再只有“通过/失败”两个状态,而是开始按照业务影响程度分级管理。
六、数据清洗真正成熟的标志,是“可追溯”
一套清洗规则上线以后,不能只留下最终结果。
还应该能够回答:
- 为什么要改?
- 按照什么规则改?
- 原始值是什么?
- 什么时候开始执行?
- 是谁确认的?
因为业务规则一直会变化。
今天“会员等级A”代表年消费10万元,明年可能调整成15万元;原来合法的订单状态,下个月也可能因为系统升级而增加新的枚举值。
如果没有规则版本和原始数据,后续很难重新计算。
所以重要数据最好形成三个层次:
- 原始数据保留事实;
- 清洗层执行统一规则;
- 应用层提供业务可用数据。
这样即使清洗规则发生变化,也还有机会回到原始事实重新处理。
结语
很多人把数据清洗理解成一项很基础的技术工作。
其实真正成熟的数据清洗,背后同时包含:
数据标准、业务规则、质量管理和治理责任。
- 确定错误的数据,可以修正;
- 有可靠依据的数据,可以补齐;
- 无法确认的数据,应该隔离;
- 超出正常范围但可能真实的数据,则应该保留并进一步核查。
因此,数据清洗真正追求的从来不是把数据“洗得特别漂亮”。
而是让每一次修改都有依据,每一个异常都有去处,每一条规则都能解释,每一次处理都能验证。
做到这一步,数据才真正从:
“系统里存着”
变成:
“业务敢拿来做决策”。

浙公网安备 33010602011771号