hive的拉链表

在最近的工作中,经常发现有用到拉链表的场景,经过一系列的学习,大概总结了一下自己对拉链表的了解,可能不是特别到位,后续再做进一步的补充,仅供参考。

名词解释

开链:向表中插入数据的过程
关链:修改结束日期的过程
存量:一段时间内系统保存的数据
增量:一段时间内系统中发生变化的数据
全量:系统中保存的所有的数。
关链时间:拉链表中的数据有效期,一般都会设计的比较大,如:3000.12.31

使用场景

有一些数据的数据量较大,但是每日的更新量相对较少。
最好的例子就是,在银行系统中,一定有一张表记录着客户的每一笔交易动态,但是银行的上亿甚至更多用户中,可能只有一部分产生了交易信息,此时,如果每天重新当天的记录全量数据,删除原来记录的话,不仅耗时耗力,且会产生一些问题,比如这样我们就看不到历史信息。
如果每天都保留全量数据,不删除历史纪录,这样我们可以看到看历史纪录,但是会产生新的问题:那些没有产生变化的数据就会被保留多次,对内存的浪费很严重。

拉链表

综上,我们可以采用拉链表进行存储,其具体做法是:记录一个事物的开始,一直到当前状态的所有变化的信息。
下面通过具体的例子来演示,拿上面的银行的例子来看(请注意开始时间和结束时间):
1.假设现在有两个账户,account1和account2,于20181127开始记录,初始存款金额都是1000

账户 金额 开始时间 结束时间
account1 1000 2018/11/27 3000/12/31
account2 1000 2018/11/27 3000/1231

2.在第二天,account1账户存入2000元,此时表中的记录应该是

账户 金额 开始时间 结束时间
account1 1000 2018/11/27 2018/11/28
account1 2000 2018/11/28 3000/12/31
account2 1000 2018/11/27 3000/12/31

3.在第三天,account1账户存入1000,account2账户取出1000,新开户了一个account3账户,并存入金额5000,此时表中记录为

账户 金额 开始时间 结束时间
account1 1000 2018/11/27 2018/11/28
account1 2000 2018/11/28 2018/11/29
account1 3000 2018/11/29 3000/12/31
account2 1000 2018/11/27 3000/11/29
account2 0 2018/11/29 3000/12/31
account3 5000 2018/11/29 3000/12/31

4.在第四天,account2账户注销,account1和account3账户无变化

账户 金额 开始时间 结束时间
account1 1000 2018/11/27 2018/11/28
account1 2000 2018/11/28 2018/11/29
account1 3000 2018/11/29 3000/12/31
account2 1000 2018/11/27 3000/11/29
account2 0 2018/11/29 2018/11/30
account3 5000 2018/11/29 3000/12/31

拉链表实现思路

通过以上几次表记录的变化,以及对开始时间结束时间的分析,我们可以发现拉链表具体的实现其实很简单,记录了数据从开始到当前时间的状态变化,从中我们不仅可看到当前的状态,还可以发现历史记录。
其具体的存储过程如下:
1.新增的数据:开始时间为插入表中的时间,结束时间为关链时间
2.更新的数据:将原数据的结束时间更改为新数据的插入时间,新数据的开始时间为插入时间,结束时间为关链时间
3.删除的数据:将结束日期修改为删除时间,表示这条记录到结束时间已经无效。

通过Hive实现拉链表

众所周知,hive中的数据不能修改,因为新增的数据我们可以正常增加,但是设计到更新的场景就无法正常修改。
对于这种场景,我们可以通过中间表进行操作,将要操作的数据和原表中进行对比,将要新增的数据,存储到一个新增的临时表,要删除的数据和更新的数据修改结束时间存储到另一个临时表,将没有变化的数据也存储到一个新的临时表,将产生的临时表合并为一个新的表,并drop掉原来的拉链表和临时表。
具体Hql语句略,有时间会补上。
如果有不完善或错误的地方欢迎指出!

猜你喜欢

转载自blog.csdn.net/weixin_43192721/article/details/84647136