一、缓慢渐变维介绍
在数仓建模中数据一般分为维度跟指标,维度就是基本不变、固定的数据,比如年、月、日、住址、手机号、区域、门店等。维度可以根据变化剧烈程度主要分为无变化维度和变化维度,但大多数维度数据会随时间的迁移是缓慢变化的,也称为缓慢渐变维(SCD)。
缓慢渐变维,即维度中的属性可能会随着时间发生改变,比如包含用户住址Address的DimCustomer维度,用户的住址可能会发生改变,进而影响业务统计精度。
而在维度表中,会出现一些更新,比如增加了新的产品,或者产品的ID号码修改了,或者产品增加了一个新的属性,此时,维度表就会被修改或者增加新的记录行。这样,在数仓设计维度和使用维度的过程中,就要考虑到缓慢变化维度数据的处理。
二、缓慢渐变维的分类
缓慢渐变维分为四种:SCD1、SCD2、SCD3、SCD4。
SCD1:不维护历史变更行为, 直接对过去数据进行覆盖。(仅适用于对错误数据的处理)
SCD2:维护历史变化行为, 每天同步全量的数据, 不管是否有变化, 均全量维护到一个新的分区中。
SCD3:维护历史变更行为,处理方式是在表中新增两个新的字段,一个是起始时间,一个是结束时间,当数据发生变更后,将之前的数据设置为过期,将新的变更后完整的数据添加到表中,重新记录其起始和结束时间,这种方案也称为拉链表。
好处:可以维护更多的历史版本的数据, 处理起来也是比较简单的 (利于维护)
弊端:造成数据冗余存储 大量占用磁盘空间
SCD4:维度历史变化,处理方式是当表中有字段发生变更后,新增一列,将变更后的数据存储到这一列中。
好处:减少数据冗余存储
弊端:只能维护少量的历史版本, 而且维护不方便, 效率比较低
三、拉链表
拉链表能够记录每条信息的开始结束时间,维护数据的新增和更新,为维度的更新和新增提供一种解决方案。由于在实际开发中,拉链表(SCD3)的使用比较多,因此下面介绍拉链表的使用步骤:
(1)首先在源数据层里(一般称为ODS层)获取到增量数据(即上一天新增和更新的数据);
(2)用原始的拉链数据 left join 增量数据,这时通过左连接就会得到更新的数据(能够关联上就代表有更新,没有关联上即为null,就是没有更新),然后修改关联到的历史数据的结束时间为上一天,这表明上一天有进行了更新。
(3)接着将进行 left join 连接后并更新的结果集再去 union all 上下合并增量数据,这时新增和更新的数据就会拼接到原来历史数据的底部,拉链表就完成了。
(4)但为了数据安全起见,一般会把最新的拉链数据优先保存到对应临时表中,保存没问题后利用insert + select 方式把临时表数据灌入到对应拉链表中。