清洗定义
我们知道,数据中台的缘由和底座是数据治理,而数据治理的最主要目的是提高数据质量、充分利用数据。
数据的质量直接影响到数据的使用方,例如数据分析、数据服务。所以数据清洗环节则显得重要且必要。在治理的过程中应该投入大量时间做好数据清洗,这是数仓乃至数湖的前置条件。
脏数据
和数据清洗一起出现的另一个词是脏数据。脏数据是指数据源中,不在给定的范围内、或对于实际业务毫无意义、或是数据格式非法、以及存在不规范的编码和含糊业务逻辑的数据。
举一个很常见的例子:电商平台的后台数据,当上游指标需要统计每周的毛利,那BI会从统计报表里拉取制定时间段内的一批订单,如果这批数据的日期字段为空,则会影响结果,部分数据没有统计到,那这一项指标就失去了参考价值。
以此为鉴,做好数据清洗,能够使得上游的数据趋近准确,更具有参考使用价值。
步骤
一般情况下,数据清洗在数仓内的贴源层进行,在保留原始数据的同时,数据在模型中展开之前,利于统一管理,统一数据规范。
基于经验和业务逻辑,我把数据清洗分为以下几个步骤:
1. 数据探索
拿到原始数据后,第一步需要人工探查数据的数据结构、数量级、字段数量、空间占用大小等,让我们对其有一定的认识,对数据有一个基本概念。
这一步,也意味着这批新数据的轮廓,第一次进入我们的大脑。
2. 过滤无效字段
在像LNMP这样的架构中,并不是所有的日志数据对于分析端都有意义,我们把徒增计算量而不具备业务价值的字段过滤掉,不参与数仓后续的ETL。
这里并没有提到去重操作,是因为有些业务场景需要重复的数据参与统计,部分指标口径包含这一部分数据,所以数据清洗这一阶段不采取去重,把操作分散到具体的聚合层。
3. 过滤空值
经常在客户系统调研的过程中发现,明明是必选项,数据库里却有2/3的空值,对于一套不够严谨或设计上存在缺陷的业务系统而言,司空见惯,但这也把信息录入缺失的问题从产品上升到了数仓层面。
和去重一样,对于这些信息不能盲目地采取删除操作,需要根据业务情况、指标需求、字段重要性多考虑,如果存在分析价值,则需要特殊处理。例如:在一段时间内产生的订单,这一批缺少时间戳的数据统一补录时间。
4. 统一格式内容
这一步会涉及到数据治理的另一部分——数据编码,把一些冗余的数据替换为精简的表达方式,例如:性别男女替换为1和0,带有“是否”的问题也同样采取1和0处理。
5. 拓展字段
在横向纵向的瘦身后,也需要适当地为表格进行一些拓展,补充数据分析必要的维度信息等,例如:把客户登录信息的IP地址转换为省市区,利于上层分析处理。
6. 隐私脱敏
脱敏简而言之就是对个人隐私、公司保密数据等进行模糊处理,避免身份证号这类数据完整地出现在表格中,而是隐藏一部分或者配合特定的加密算法。
在日前的项目中,尤其大型企业逐渐重视隐私计算,在意企业内部数据的安全性,所以我把脱敏加入到清洗的步骤中,但并不一定要在这里进行处理。如果客户不希望真实数据暴露在我方服务器中,则加密会发生在采集之前。
7. 关联性验证
最后一步不仅是对前面操作的验证,也是对不同系统中数据的验证,在当前系统中、在多个相关系统中,同样属性同样意义的数据是否一致。例如:从不同渠道录入的同一个客户的名称和信息一致性,虽然这是一个较为低级的问题,但并不罕见。
暂且不讨论为什么会存在多渠道录入,很多企业的系统与流程很难调整改变,数据治理并不能调整客户企业的业务。假使遇到这样的问题,需要考虑的是接受复杂的业务关系,解决数据关联性。
在贴源层存储原始数据备份,基于数据清洗后的数据,在汇总层进行数据开发、指标开发、数据服务。这是数据清洗,也是贴源层的逻辑。