浅谈数据仓库体系(3)-历史层

浅谈数据仓库体系(3)-历史层,第1张

如上文所说,一个基本的数据仓库分为贴源层,历史层,数据模型层

本文主要来讲一下历史层(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拉链表的使用不方便。
三历史层的数据校验

历史数据的准确性,是数据仓库分析的基础,对于历史数据的校验,其他也遵循通用的校验方法,因为多了历史数据缘故,还可以加一些趋势性的校验方法,比如同比,环比的数据总量,某一类指标的变化阈值,都可以根据历史数据做一定的预警

维度属性通常不是静态的,而是会随时间变化的,数据仓库的一个重要特点就是反映历史的变化,所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态,通常有以下两种做法,分别是全量快照表和拉链表

1 )全量快照表

离线数据仓库的计算周期通常为每天一次,所以可以每天保存一份全量的维度数据。这种方式的优点和缺点都很明显

优点是简单而有效,开发和维护成本低,且方便理解和使用。

缺点是浪费存储空间,尤其是当数据的变化比例比较低时。

2 )拉链表

拉链表的意义就在于能够更加高效的保存维度信息的历史状态。

拉链表是记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当期日期放入生效开始日期,如果当前信息至今有效,再生效结束日期种填入一个极大值

(1)什么是拉链表
拉链表适合于:数据发生变化,但是变化频率并不高的维度(即:缓慢变化维)

比如:用户信息会发生变化,但是每天变化的比例不高。如果数据量有一定规模,按照每日全量的方式保存效率很低。比如:1亿用户365天,每天一份用户信息(做每日全量效率低)

通过,生效开始日期<=某个日期且生效结束日期>=某个日期
如果事实表中一条记录在某个维度表中有多条记录与之对应,称为多值维度。例如,下单事实表中的一条记录为一个订单,一个订单可能包含多个商品,所会商品维度表中就可能有多条数据与之对应。

针对这种情况,通常采用以下两种方案解决。

第一种:降低事实表的粒度,例如将订单事实表的粒度由一个订单降低为一个订单中的一个商品项。

第二种:在事实表中采用多字段保存多个维度值,每个字段保存一个维度id。这种方案只适用于多值维度个数固定的情况。

建议尽量采用第一种方案解决多值维度问题

维表中的某个属性同时有多个值,称之为“多值属性”,例如商品维度的平台属性和销售属性,每个商品均有多个属性值。

针对这种情况,通常有可以采用以下两种方案。

第一种:将多值属性放到一个字段,该字段内容为key1:value1,key2:value2的形式,例如一个手机商品的平台属性值为“品牌:华为,系统:鸿蒙,CPU:麒麟990”。

第二种:将多值属性放到多个字段,每个字段对应一个属性。这种方案只适用于多值属性个数固定的情况

两者主要在是否会记录每一个修改、用途以及是否可以很快的还原客户记录等三方面存在区别。

一、是否会记录每一个修改

拉链表:拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已。

流水表:流水表对于表的每一个修改都会记录,可以用于反映实际记录的变更。

二、用途

拉链表:拉链表常用于统计账户及客户的情况。

流水表:流水表常用于统计业务相关情况。

三、是否可以很快还原客户记录

拉链表:通过拉链表可以很方便的还原出拉链时点的客户记录。

流水表:流水表虽然也可能做得到,但是效率不行,或者需要人工参与。

扩展资料

拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。

拉链表的作用:

1、数据量比较大。

2、表中的部分字段会被更新,比如用户的地址,银行利率,订单的状态等。

3、 需要查看某一个时间点或者时间段的历史快照信息,比如,查看利率在历史某一个时间点的状态。

4、变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右。

5、如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;

拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储。

参考资料来源:百度百科-拉链表

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
1第一范式
确保每列保持原子性
列不可分
有主键
根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分 *** 作的时候将非常方便。这样设计才算满足了数据库的第一范式

数据仓库 历史拉链表
Data warehouse history zipper table
数据仓库 历史拉链表
Data warehouse history zipper table


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13337834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-17
下一篇 2023-07-17

发表评论

登录后才能评论

评论列表(0条)

保存