1.背景
拉链表是什么,在数仓建立时候,一种重要的表数据处理方式,可以将数据结构于算法,类比于拉链表于数仓,旨在解决数仓建立里面的SCD需求,那么什么是SCD,就是缓慢变化维,随着时间流逝,数据相对事实表发生缓慢变化。
SCD的常用处理方式有以下几种:
保留原值
直接覆盖
增加新属性列
快照表
拉链表
本文主要讲解拉链表来处理SCD的问题,其特点归纳以下,有以下几种场景时候,可以使用拉链表。
1.表数据量较大,用全量表会占用很多存储
2.表数据会有修改,用增量表,难以处理重复且修改数据
3.有回溯的需求,需要知道历史某个时间点的全量数据
4.数据有修改,但是频率和量不是很大比如只有百万分之一有修改
2.拉链表处理理论
首先拉链表是一个全量表且不是分区表,为了达到前面描述的各种效果,必然需要一个中间表来做中间跳板,这个中间跳板表是一个分区表,数据是增量数据,增量内容包括修改和增加,即常常是create_time or update_time
落在当前天,对于拉链表需要增加两个与原始数据没有关系的两个字段来标识数据开始时间和有效截至时间,在示例中,这两个日期分别为start_date
和 end_date
,拉链表其处理方式主要有以下三种:初始化,每天更新数据,回滚数据。
2.1 初始化和新增数据
其每天的滚动方式如下图:
初始化部分,是拉链全量表的开始时间,也奠定了回滚时候能够回滚的最早时间,每天更新逻辑如上图,新增数据会分为两部分,一部分是每天新增的数据,对于当天分区里面有相同变化或者未变化的数据时候,分别修改对应的start_date
和 end_date
即可达到更新数据。
2.1 数据回滚
对于上面的更新逻辑,我们来考虑如何回滚数据,即回到历史的某个时间点,对于拉链表来说是全量表,所以只有一个回滚即可。回滚策略可以根据回滚时间点和数据生成的start_date
和 end_date
,具体怎么回滚,我们来看下面的示意图:
在
end_date < rollback_date
的数据要保留,对于处理end_date ≥ rollback_date ≥ start_