如上文所说,一个基本的数据仓库分为贴源层,历史层,数据模型层
本文主要来讲一下历史层(his),重点是如下三个方面
1.历史层的数据清洗
2.历史层的数据存储
3.历史层的数据校验
历史层,顾名思义,就是保存所有的历史数据,我们知道数据仓库的一个原则就是数据是不变的,就是说进来了的数据就不做更改,不做删除,那这个不做更改,不做删除,主要体现在的就是历史层。
数据仓库体系是一个OLAP体系,主要用来分析历史数据的,那么历史层数据的保存就显得异常的重要。
一.历史层的数据清洗
到了历史层,其实对清洗的要求也不会很高,如果在ODS层做了基本的清洗,那么在历史层要做的清洗就更少了。历史层因为是保存历史的数据,简单的理解就是把ODS的数据全部都存一遍,历史层的粒度最好还是保持最细的粒度,在历史层来说,相对更为重要的应该是存储了。本文也主要讲述历史层的存储
二.历史层的数据存储
历史层的数据存储主要有4种,1.全量,2.增量切片,3.全量切片,4.拉链
1.全量
如前面ODS讲到的,如果我们是全量把数据导入到ODS的,我们会根据业务需要,如果是缓慢变化的,或者确认这种变化后对我们的业务作用基本可以忽略不计的,我们通常就采取全量的方式存储,这样的存储方式其实是和ODS里面一样的。
2.全量切片
如前面ODS讲到的,如果我们是全量把数据导入到ODS的,如果数据量不是很大的话,我们通常考虑全量切片的方式。就是把每一次全量抽取过来的数据都保存下来,然后在后面加一个操作时间字段
这里要讲一下选择全量存储,还是全量切片存储的问题
对于数据仓库来说,因为要保存历史的数据,历史的变化,那么在这种原则下,我们肯定优先选择全量切片存储了。但是,我们还需要考虑其他的存储和实际的业务情况。
(1)个就是存储空间的问题,假设一张很大的表从源体系全量抽取的,每天1个T,一年下来就365T,hive中再乘以3,那对存储空间的要求实在太多了。可能这张表变化的字段就是一个一年就用一次的字段。从存储和使用比来说,划不来。
(2)个就是使用问题,在hive这种有分区的数仓体系中还好,如果是oracle,TD等数据仓库,如果这张表存储了1年的数据,我要查一个某一天的数据的某一部分,可能怎么样都没法查出来了
所以通常的原则,1.是小表,变化比较频繁的表,变化的字段比较重要,并且经常要进行历史对比的表,考虑全量切片
如果是变化比较慢,并且变化的字段基本不用的,就全量存储就好,比如,一张地区维度表,把北京市统一改为北京存储了,其实就没有必要每天都存一遍了。
(3).就是数据量大,变化的字段比较缓慢的,这样也考虑用全量表
那么这里问题就来了,如果数据量大,又变化的字段比较重要呢?
也许这真的就是数据存储中的一个难题了,现在大数据量,又变化快的情况,可能主要使用的还是增量切片的方式,
3.增量切片,就是把新增的数据存储下来,或者说变化的数据存储下来,一般来说,这是当前一种主要的存储形态
主要优点有2个:
1> 增量数据相对全量数据来说,量级会少好多,会节省很多存储空间
2>每天存储变化的值,在我们做相关使用时,效率会更高,总体的数据量级会少
4.拉链表
拉链表对于很多人来说可能比较陌生,一般做数据仓库没做个一年,可能都不会接触到这种类型的表,并且目前考虑用这种表存储的情况,实际来说比较少,这里就说两点:1.拉链表本质上适合与缓慢变化的大量数据集,2.拉链表的使用不方便。
三.历史层的数据校验
历史数据的准确性,是数据仓库分析的基础,对于历史数据的校验,其他也遵循通用的校验方法,因为多了历史数据缘故,还可以加一些趋势性的校验方法,比如同比,环比的数据总量,某一类指标的变化阈值,都可以根据历史数据做一定的预警