什么是拉链表?
通过增加开始时间字段和结束时间字段,来控制数据生命周期的表。
拉链表的作用
1.提高效率。
处理缓慢变化维的数据,如果一个维度表的数据总量很大,但是每天增加或变化速度不大,使用拉链表可以避免全量抽取和覆盖的低效。
2.保留历史数据。
拉链表可以对历史的切片数据进行查询,也可以回滚到历史的状态。
拉链表的制作
思路:
1.添加字段与初始化。
将需要制作拉链表的表添加creatime和endtime两个字段。
并将createtime初始化为今天,endtime初始化为9999-99-99。
2.结束原表中修改了的数据的生命周期。
获得新一天数据的新增和变化表后,查询原表的数据将原表变化了的数据的endtime设置为昨天(通过新增和变化表和原拉链表将id字段作为关联字段进行左关联得到)。
3.将新增和变化了的数据插入到修改后的拉链表中(两表union all形成一个新的拉链表覆盖原拉链表)。
具体方法:
1.拉链表的初始化,要有开始时间和结束时间。
2.将dwd层原拉链表,与ods层查询出来的“昨天”时间分区的变化表left join,关联后的某个记录如果来自变化表的字段数据不为空(比如主键),并且这条记录的endtime字段值为9999-99-99(注意,如果不加这个条件,会将这条数据对应的id所有的生命周期已经结束了的历史数据都包含进来),这说明这条记录中来自拉链表的数据在昨天以前生命周期还没有结束,并在昨天被修改了。于是将这条数据的endtime将历史拉链表中变化了的数据结束字段设置为T-1(结束它的生命周期),然后与加入开始字段和结束字段的变化表union all,结果作为临时拉链表。
3.临时拉链表覆盖历史拉链表得到新的拉链表。
修改结束时间字段,用到到了if(表达式1,参数1,参数2),当然也可以使用case when。
拉链表的查询
如果想要查询某个历史切片(某个历史时间点上所有生命周期没有结束的数据)的数据,可以通过限定createtime和endtime来实现。
createtime≤历史日期 and endtime≥历史日期。
拉链表如何回滚?
回滚是什么意思?
就是将拉链表中的所有数据返回到过去的某一个时间点。
回滚方法
1.通过where将当前拉链表中的回滚日期以前的数据过滤出来。
2.将过滤出来的数据,endtime在回滚日期后面的endtime修改为9999-99-99。
缓慢变化维的处理方法
1.每天一份快照。
修改原维度表的属性值,只保存最新的维度数据。
2.每天一份全量。
这种方法没有历史数据,并且,全量抽取导入的效率很低。
每天一份全量的维度数据,保留了历史数据,但是浪费存储空间。
注意:每天一份全量和每天一份快照的区别在于后者会保留历史的数据,前者不会。
3.拉链表。
通过链表的表的形式,既可以保留历史的数据,又不需要多少额外的存储空间。