关于数据仓库中历史数据存储解决方案知识点的记录
Posted kubboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数据仓库中历史数据存储解决方案知识点的记录相关的知识,希望对你有一定的参考价值。
我发现随着时间的流逝,之前存在脑海中的知识也在慢慢变淡,有些甚至变得模糊,为了使这些知识能够在需要的时候找出来快速的应用在工作中,我决定从今天开始把实际工作中遇到或者自己学习生活中碰到好的知识点都记录下来,以备不时之需;这算是一种总结,也算是一种模块化的记录吧!
还记得最早接触数据仓库是在2012年,那时候公司用的是高大尚的SAP(企业管理解决方案),而那时我也刚刚转入数据中心,那时有太多的东西要学习要了解,有两个概念着实让我混淆了好一段时间;BI是啥?BW又是什么东东?两有什么区别?有什么互通的地方?
后来跟着前辈才慢慢知道了“BW指数据仓库,BI仅指前端展示包括数据挖掘等分析工具”,当时BW模块比较重要,因为技术关注的重点在数据仓库嘛,现在SAP似乎称BI模块更常见;这个变化也反映了SAP的市场宣传策略的变化,毕竟“商务智能”听起来是不是比“数据仓库”更能吸引老总们的兴趣,我猜的,不过未来将是数据可视化的天下,一堆报表的时代已经结束。
转入今天的正题,当时自己玩数据库也有好一阵子了,也算是大都了解的程度,当时很好奇为什么要单独搞一个数仓干嘛,直接应用业务数据库的备份库就可以了,后来这个思维被一点点纠正过来,了解了数仓建立的重要性,也知道了数据仓库的存储逻辑,不过话说现在我也忘的差不多了,具体细节更是抛到九霄云外,为了不至于彻底忘记,我把数仓的历史数据存储解决方案逻辑记录下来,以备后患;下边进入正题:
首先在实际的工作(数据模型设计)中我们经常会碰到这样的问题或者说需求:
1. 数据量比较大;
3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;
面对这种情况我们需要怎么办才能避免资源的浪费?最终的解决方案是这样的:数据库中同样的表都是由两张,一个存储当前最新的状态信息,一个表记录信息的变更。在此次设计中采用生命周期的概念,每条记录都有一个生效时间和失效时间的字段,即一条记录添加进数据库就是生命周期的开始,之间做的修改等操作,只是影响生命周期中不同的时间内的状态,到删除就是生命周期的结束。任何记录都没有真删除,用一个字段来标识本条信息是否可用,对当前信息表中的记录做一次更改就往历史表中添加一条记录,同时更改失效时间为当前时间。在做页面的时候分两种情况:对于当前信息做一个维护页,信息可以增删给查,用的是当前数据表;历史查询页,查出来的信息不能进行操作,查询数据需要利用历史表和当前表的联合查询。一切都是以时间做限制,信息的变动也是随着时间来,任何一个实体在某一个时间上都会有自己的唯一状态,这样就可以实现对信息的任意一个时刻的状态信息的查询。
这个随生命周期变化的表就叫做拉链历史表,它既能满足反应数据的历史状态,又可以最大程度的节省存储,下边看看历史拉链表的技术设计和实现:
首先是技术设计方面:
在企业中,由于有些流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此可以使用拉链表的算法来节省存储空间。
1.采集当日全量数据存储到 ND(当日) 表中。
2.可从历史表中取出昨日全量数据存储到 OD(上日数据)表中。
3.用ND-OD(minus差集)为当日新增和变化的数据(即日增量数据)。
两个表进行全字段比较,将结果记录到tabel_I表中
4.用OD-ND为状态到此结束需要封链的数据。 (需要修改END_DATE)
两个表进行全字段比较,将结果记录到tabel_U表中
5.历史表(HIS)比ND表和OD表多两个字段(START_DATE,END_DATE)
6.将tabel_I表的内容全部insert插入到HIS表中。START_DATE='当日',END_DATE可设为'9999-12-31'
7.更新封链记录的END_DATE
历史表(HIS)和tabel_U表比较,START_DATE,END_DATE除外,以tabel_U表为准,两者交集(INTERSECT)将其END_DATE改成当日,说明该记录失效。
8。取数据时对日期进行条件选择即可,如:取20100101日的数据为
(where START_DATE<='20100101' and END_DATE>='20100101' )
其次是技术实现方面:
将全量数据存储在Hbase中,现状数据另存一份到Hive中。
查询历史数据有两种方案,一种是 Hbase 表通过外表的方式映射成对应的Hive表,应用层通过类sql的方式查询对应的Hbase库。另一种搭建 Phoenix 环境,应用层通过类sql方式访问Phoenix 关联的Hbase数据库。目前笔者采用的是第一种方式。主要原因是目前该数据仓库对外提供数据是以Hive Jdbc方式,缺点是效率不高。
最后把历史拉链表的原理做一个简述:
样例数据如下:
存储成历史拉链表的方式如下:
1、结束时间为9999-12-31为当前有效数据
2、查询2017-6-2时机构情况: select * from tableName where start_date <= ‘2017-6-2’ and end_date >= ‘2017-6-2’
由上述样例可以发现当数据更新时只有发生变更的数据会被保存,也就是说该方式数据的冗余量比较小。
以上是关于关于数据仓库中历史数据存储解决方案知识点的记录的主要内容,如果未能解决你的问题,请参考以下文章