拉链表

24 Mar 2021

缓慢变化维

缓慢变化维(SCD;Slowly Changing Dimensions)。在现实世界中,维度的属性随着时间的流失发生缓慢的变化(缓慢是相对事实表而言,事实表数据变化的速度比维度表快)。
处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,简称SCD问题。处理缓慢变化维的方法有以下几种常见方式:

保留原始值

维度属性值不做更改,保留原始值。
如商品上架售卖时间:一个商品上架售卖后由于其他原因下架,后来又再次上架,此种情况产生了多个商品上架售卖时间。如果业务重点关注的是商品首次上架售卖时间,则采用该方式。

直接覆盖

修改维度属性为最新值,直接覆盖,不保留历史信息。 如商品属于哪个品类:当商品品类发生变化时,直接重写为新品类。

增加新属性列

在维度表中增加新的一列,原先属性列存放上一版本的属性值,当前属性列存放当前版本的属性值,还可以增加一列记录变化的时间。
缺点:只能记录最后一次变化的信息。

快照表

每天保留一份全量数据。 简单、高效。缺点是信息重复,浪费磁盘空间。
适用范围:维表不能太大
使用场景多,范围广;一般而言维表都不大。

拉链表

拉链表适合于:表的数据量大,而且数据会发生新增和变化,但是大部分是不变的 (数据发生变化的百分比不大),且是缓慢变化的(如电商中用户信息表中的某些用 户基本属性不可能每天都变化)。主要目的是节省存储空间。

适用场景:

周期性事实表

比如订单表,创建之后会有状态变化。

前提条件:

拉链表的实现

hive 的实现

原始数据

实现思路

  1. 初始化数据,生效时间是当天,失效时间永久
  2. 新增的时候,查看历史表是否有id一样的数据,
    有的话把历史数据的失效时间改为昨天(hive弱支持事务,每次新增都需要覆盖整张表)
  3. 添加新增数据,开始时间当日,结束时间永久
  4. 每日重复2、3

具体实现