一 概述
1 数据质量问题无处不在
基本上每个用数据的同学,都遇到过以下类似的问题。
- 表没有按时产出,影响下游,严重的甚至可能影响线上效果。
- 打点缺失,看了报表才发现数据对不上。
- 数据统计出来,uv大于pv,很尴尬。
- 数据产出暴增,本来1000万的数据变成了3000万。
- 字段里面的枚举值和注释里面的对不上,没人能解释。
- 某些维度缺失,没法做进一步的数据分析。
- 做了一通分析,发现结果很离谱,一点点向前分析,发现打点有问题。
·
- ……
以上都是数据质量的问题。本文尝试找到一种方法,能够尽可能的发现数据质量问题并解决之。
2 数据标准
谈到数据质量,就必须了解评价数据质量的维度。DAMA UK 提出了数据质量的六个核心维度,见图1。
注:DAMA International (国际数据管理协会)成立于1980年,是一个由技术和业务专业人员组成的国际性数据管理专业协会,作为一个非营利的机构,独立于任何厂商,旨在世界范围内推广并促进数据管理领域的概念和最佳实践,为数字经济打下理论和实践基础。全球会员近万人,在世界48个国家成立有分会。
图1 数据质量维度
- 完整性Completeness:完整性是指数据信息信息是否存在缺失的状况,常见数据表中行的缺失,字段的缺失,码值的缺失。比如虽然整体pv是正确的,但在某个维度下,只有部分打点,这就是存在完整性的问题。不完整的数据所能借鉴的价值就会大大降低,也是数据质量问题最为基础和常见的问题。常见统计sql:count( not null) / count(*)
- 有效性Validity :有效性一般指范围有效性、日期有效性、形式有效性等主要体现在数据记录的规范和数据是否符合逻辑。规范指的是,一项数据存在它特定的格式,如:手机号码一定是11位的数字;逻辑指的是,多项数据间存在着固定的逻辑关系,如:PV一定是大于等于UV的。
- 准确性Accuracy:准确性是指数据记录的信息是否存在异常或错误。最为常见的数据准确性错误就如乱码。其次,异常的大或者小的数据也是不符合条件的数据。准确性可能存在于个别记录,也可能存在于整个数据集,例如数量级记录错误。这类错误则可以使用最大值和最小值的统计量去审核。
- 及时性Timeliness:及时性是指数据从开始处理到可以查看的时间间隔。及时性对于数据分析本身的影响并不大,但如果数据建立的时间过长,就无法及时进行数据分析,可能导致分析得出的结论失去了借鉴意义。比如:实时业务大盘数据,及时反映业务关键指标的情况,暴露业务指标的异常波动,机动响应特殊突发情况都需要数据的及时更新和产出。某些情况下,数据并不是单纯为了分析用而是线上策略用,数据没有及时产出会影响线上效果。
- 一致性Consistency:一致性是指相同含义信息在多业务多场景是否具有一致性,一般情况下是指多源数据的数据模型不一致,例如:命名不一致、数据结构不一致、约束规则不一致。数据实体不一致,例如:数据编码不一致、命名及含义不一致、分类层次不一致、生命周期不一致等。
- 唯一性Uniqueness: 在数据集中数据不重复的程度。唯一数据条数,和总数据条数的百分比。比如 count(distinct business key) / count(*),一般用来验证主键唯一性。
3 数据的生命周期
图2 数据生命周期
- 数据接入:接入上游表输入或者其它数据源的数据。
- 数据加工:编写sql生成目标数据表。
- 数据产出:定时调度任务生成数据表。
- 数据应用:下游数据分析、报表等应用数据。
在上面任何一个环节中,都可能出现数据质量的问题,提升数据质量需要从数据接入、数据加工、数据产出、数据应用、效果跟踪等全流程进行把控,全局观很重要,不拘一点,才能看的更全面。
二 如何解决数据质量问题
数据质量是数据的生命线,没有高质量的数据,一切数据分析、数据挖掘、数据应用的效果都会大打折扣,甚至出现完全错误的结论,或者导致资损。然而数据质量问题却是广泛存在的,且治理的难度很大,因为数据的生产、加工、流转、应用涉及到业务运营、生产系统、数据系统、数据产品等上下游链路几十个环节,每个环节都可能引入数据质量问题。
集团很多BU都有成体系的解决数据质量的方案,集团也有很多工具来解决数据质量问题。本文不详细介绍此类工具的使用,主要聚焦在数据开发过程中因为数据研发同学经验不足而导致的数据质量问题。
图3 数据质量解决方法
如图3所示,我认为有三种方法可以在一定程度上解决数据质量的问题。
- 数据探查
- 发现完整性、一致性、有效性、准确性、关联性等问题
- 解决的数据接入和数据产出阶段的问题
- 开发规范
- 发现数据及时性、数据一致性、数据准确性等问题
- 解决数据产出阶段的问题
- 数据监控
- 避免一致性、准确性等问题
- 解决数据生产阶段的问题
1 数据探查
数据探查的定义一般为:数据探查是探索源数据的过程,用来理解数据结构、数据内容、数据关系以及为数据工程识别可能存在的问题。
数据探查不止用在数据质量领域,数仓开发、数据迁移等都需要对源数据进行数据探查。数据仓库的所有数据基础都是源数据(ODS),在开发数仓之前,需要对源数据进行探查,才能保证产出的数据仓库的准确性。
题库业务的数据缺少打点,数据建设主要基于业务架构的一些中间表和结果表,在开发前期,没有意识到数据探查的重要性,导致数据的准确性有严重问题,数据研发出现了大量的返工现象。
dataworks提供了数据探查的功能,可以统计基本信息、数据分布、topN、直方图等。但我试了几次一直是探查中,易用性还不是太好。
图4 数据探查基本方法
上图是数据探查的一些基本功能。
本部分介绍数据探查的一些常见方法,不成体系,只是开发过程中遇到的问题,供参考。
表探查
1)数据总量探查
数据总量探索是对ods的总体数据有初步认知,可以通过数据地图的分区信息确认,也可以通过写sql计算。
数据总量探查时要探查每日增量数据总量、全量数据总量(如有需要)。
一般情况下,数据总量探查结果要与业务方或者上游数据提供方确认是否符合预期。
2)数据产出时间和生命周期探查
在做数据探查时,需要探查数据产出时间和生命周期,对后续的任务调度和补数据有一定的帮助。
列探查
1)数据分布探查
数据分布探查是数据探查中最重要的部分,可以探测不同维度下数据的分布情况。一般情况下,有如下写法。
SELECT result ,COUNT(*) FROM xxx.table_name WHERE dt = 'xxxxx' GROUP BY result ;
2)枚举值探查
枚举值探查是上面数据分布探查的一种特例,探查某些维度的枚举值是否合理。一般情况下sql如下。
SELECT DISTINCT result FROM xxx.table_name WHERE dt = 'xxxxx' ;
这种探查,可以探查出很多问题,比如上游生成某枚举值只有0和1,但探查的时候探查出为空等。
3)唯一值探查
某些情况下,上游生成某些字段唯一(不一定是主键),也需要对此类情况探查,不然做join时容易出现数据膨胀问题。探查sql一般如下。
SELECT COUNT(item_id) ,COUNT(DISTINCT item_id) FROM xxx.table_name WHERE dt = 'xxxxx' ;
4)极值&异常值探查
对于某些数值类的值,必要情况下可以做一下极值探查,比如求最大值、最小值、平均值。这样可以尽快发现源数据中的脏数据。
对于异常值也要探查一下,比如0、null、空字符串等。