现状:隔一段时间去数据中心获取一次数据,每次获取数据时只有极少部分数据会发生变更,但是系统需要溯源数据变更的情况。
方案:
现状表+历史表结合的方式:
现状表:即数据的当前、最新状态的表;基本上可以认为是目前的数据不变;
历史表:即保存数据的历史变更记录,通过这个记录可以还原出数据的所有变更情况;
根据业务情况,可以查询现状表或者历史表。
技术实现:
将全量数据存储在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’
由上述样例可以发现当数据更新时只有发生变更的数据会被保存,也就是说该方式数据的冗余量比较小。
具体样例如下:
表说明:
t_hbase_person_his10 源数据存储在Hbase,t_hbase_person_his10 为源数据映射成的Hive表,数据量1000万;
如下当前的数据(通过Hive查询):
sql : SELECT ID,NAME, SALARY, MOBILE, START_DATE, END_DATE FROM t_hbase_person_his10 where end_date = ‘9999-12-31’ LIMIT 30;
查询 ‘2017-09-18’ 的数据(通过Hive查询):
SELECT ID,NAME, SALARY, MOBILE, START_DATE, END_DATE FROM t_hbase_person_his10 where start_date <= ‘2017-09-18’ and end_date >= ‘2017-09-18’ LIMIT 30;