【数据仓库】缓慢变化维介绍及其解决SCD问题

本文深入探讨了数据仓库中缓慢变化维(SCD)问题的多种解决策略,重点介绍了使用拉链表来有效存储和查询历史快照的方法。通过实例说明如何处理用户维度表中的数据变化,对比了保留原始值、改写属性值、增加维度新行等方案,最终推荐采用拉链表以保留完整的历史记录。

目录

介绍

举例说明

SCD问题的几种解决方案

保留原始值(不推荐)

改写属性值(不推荐)

增加维度新行(推荐)

增加维度新列(不推荐)

添加历史表(不推荐)

使用拉链表保存历史快照思路

拉链表

12月20日商品拉链表的数据(全量数据同步):

12月21日商品拉链表的数据(增量数据同步)

12月22日商品拉链表的数据(增量数据同步)

拉链表存储历史快照代码实现

操作步骤:

MySQL&Hive表初始化

全量导入2019年12月20日数据

增量导入2019年12月21日数据

查询拉链表


  • 介绍

缓慢变化维,简称SCD(Slowly Changing Dimensions)

一些维度表的数据不是静态的,而是会随着时间而缓慢地变化(这里的缓慢是相对事实表而言,事实表数据变化的速度比维度表快)

这种随着时间发生变化的维度称之为缓慢变化维

把处理维度表数据历史变化的问题,称为缓慢变化维问题,简称SCD问题

 

  • 举例说明

用根据用户维度,统计不同出生年份的消费金额占比。(80后、90后、00后)。

而期间,用户可能去修改用户数据,例如:将出生日期改成了 1992年。此时,用户维度表就发生了变化。当然这个变化相对事实表的变换要慢。但这个用户维度表的变化,就是缓慢变化维。

用户ID

用户名

出生日期

住址

114

张三

1988-09-08

北京市朝阳区

这个用户的数据不是一直不变,而是有可能发生变化。例如:用户修改了出生日期、或者用户修改了住址。

 

  • SCD问题的几种解决方案

保留原始值(不推荐)

某一个属性值绝不会变化。事实表始终按照该原始值进行分组。例如:出生日期的数据,始终按照用户第一次填写的数据为准

 

改写属性值(不推荐)

对其相应需要重写维度行中的旧值,以当前值替换。因此其始终反映最近的情况。

当一个维度值的数据源发生变化,并且不需要在维度表中保留变化历史时,通常用新数据来覆盖旧数据。这样的处理使属性所反映的中是最新的赋值。

 

修改前:

用户ID

用户名

出生日期

住址

114

张三

1988-09-08

北京市朝阳区

修改后:

用户ID

用户名

出生日期

住址

114

张三

1992-09-08

北京市海淀区

这种方法有个前提,用户不关心这个数据的变化

这样处理,易于实现,但是没有保留历史数据,无法分析历史变化信息

 

增加维度新行(推荐)

数据仓库系统的目标之一是正确地表示历史记录。典型代表就是拉链表。保留历史的数据,并插入新的数据。

 

修改前:

 

用户ID

用户名

出生日期

住址

9527

114

张三

1988-09-08

北京市朝阳区

  

修改后:

编号

用户ID

用户名

出生日期

住址

9527

114

张三

1988-09-08

北京市朝阳区

9528

114

张三

1992-09-08

北京市海淀区

 

增加维度新列(不推荐)

用不同的字段来保存不同的值,就是在表中增加一个字段,这个字段用来保存变化后的当前值,而原来的值则被称为变化前的值。总的来说,这种方法通过添加字段来保存变化后的痕迹。

 

修改前:

编号

用户ID

用户名

出生日期

住址

9527

114

张三

1988-09-08

北京市朝阳区

修改后:

编号

用户ID

用户名

出生日期

 

住址

现住址

9527

114

张三

1988-09-08

1992-09-08

北京市朝阳区

北京市海淀区

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值