ETL过程的数据测试

1.记录数对比
在两种情况下必须要做如此的验证:
a. 数据迁移
这个场景主要是DW环境从一种迁移到另一种,比如RAC迁到HIVE之类的,记录数对比是首要的,迁移的数据量都不对,具体的数据内容对不对就不用考虑了。
b. ETL转换
这种场景是更常见的,毕竟数据研发,ETL过程是必不可少的。那么,记录数对比主要涉及如下几类:
1). 从操作型数据库抽取数据到数据仓库,这个过程由于字符集、字段类型、系统软硬件等原因,不可避免数据会丢失,这个时刻不关注记录数的差异,后续如何能正确利用数据
2). 根据数据模型做数据处理和应用,这个过程任何做数据研发,数据分析的,都不陌生,在这个过程中估计也不可能没有人没有遇到过记录数不一致的情况。此过程,如果能解决记录数一致问题,其实顺带解决了很多数据逻辑问题,以关系型数据为例,任何数据的转换,都是从N张表关联得到M张表的过程,我们解决记录数一致问题其实就是解决:1.数据粒度验证;2.数据筛选过滤验证;3.关联错误产生数据重复等问题
2.度量平衡验证
此类验证是局部和整体的关系,局部要服从整体,也就是验证 执行结果中可累加度量的总量 。比如,一张反映网站访问量的表,此表每天的数据量是1个亿,如果我们按性别维度做汇总聚合,男性访问量是5千万,女性访问量是4千万,5千万+4千万 != 1个亿。很明显,这个数据肯定有问题,我的1千万流量去哪儿了?我们通过度量平衡验证找到了问题的现象,那引起问题的原因呢?这就要结合其他几类测试方法,针对这个例子,第一反应可能是性别字段为空,这1千万可能就是这样。
3.数据抽样检测
此类测试是最出力不讨好的体力活,抽样的成本比较高,但很多时候还发现不了问题。不过这类测试是最不能忽略的,因为真正能通过此类测试发现问题的,这个问题就比较隐晦,有时候搞不灵清到底是不是问题。
这类测试更重要的是有个提前判断,划定一个标准,比如,一个字段必须是非空的,我们抽样就是验证非空;一个字段必须是双精度数字类型,但是表结构定义为整型数字类型,精度丢失就会导致数据的异常,如果我们是算钱的,1.6块变成1块,当有1个亿这样的数据,你就真亏大发了。这类是值自身的问题。
还有类数据抽样可能和数据分析关系更深一点,而且这个会更隐晦了。比如一个指标在以往一个月的趋势里都平稳在500万左右,但是突然今天这个指标变成100万了,你就要怀疑是否存在问题,这种情况很有可能有人动了你刷新数据的代码。这类测试对我们数据研发人员有更高的要求,有的人总把自己定位为数据开发,其实玩数据,开发是本职,但是不懂分析,有时候开发还真会存在很大的陷阱。建议我们的数据研发人员也多关注下业务,了解些分析的技能。
4.重跑测试,两次输入测试结果是否完全一致
此类测试主要是针对数据刷新代码开发完毕,开始自测这个过程,以后可能不用太关心这类测试。
我们不能避免我们永远不会犯错误,如果数据错了就要重新来过,但是我们的代码不支持重新跑,修正数据错误就比较麻烦,有时候可能就没办法修正。
首先,我们要在设计时,考虑如何写代码保证可以支持重跑,其次,就算我们设计的代码是支持重跑的,我们也要在自测阶段,重复跑几次代码,比对数据和逻辑,真正保证重跑是没有问题的
5.唯一性检查
此类测试导致的影响可大可小,一般在越底层出现,问题越严重,绝对是蝴蝶效应的威力。如果一份数据的关联字段不一致,生成的数据就会产生笛卡尔积的数量效果,我有个同事一个笛卡尔积把整个系统hang住了。
我个人非常注重粒度,每个数据表是什么粒度的,一旦我知道这个表是什么粒度的,我就能知道这个表的唯一性是什么,对非表粒度级别的维度,我会很慎重,因为它不代表唯一性。所以,唯一性检查对我而言是水到渠成的事情,就是因为我首要关注粒度,理解粒度后就不会犯唯一性的错误。
6.重复记录检查
此类测试和唯一性检查时对称的,非唯一,那肯定有重复。所以此检查和唯一性检查是如此的相辅相成。
7.空值检查
数据处理的重要工作之一就包括空值的过滤或者默认化处理。当我不知道我利用的数据对空值是过滤、默认化处理还是不处理,在利用这些数据关联生成我想要的数据时就会产生不一样的结果。
a. 过滤:太好了,你不用考虑空值了
b. 默认化处理:如果你用表A和B关联得到C,如果A表做了默认化处理,B表没做默认化处理,你觉得你能得到正确的数据吗
c. 不处理:类似默认化处理,不处理也是一种默认化处理,默认的口径不一致,根本的不到正确的数据
所以空值检查首先要知道空值的处理方式,保证处理的N处数据源的空值处理方式是一致的,其次要知道空值的处理是否会影响数据处理效率和数据处理结果

猜你喜欢

转载自hugh-wangp.iteye.com/blog/1487017