虽然我的主业是实时计算和批量计算,并不是数仓,但是在日常工作中绝对少不了与数仓打交道。并且我也算是参与过离线数仓建设的,维度建模的基础还是不能忘。本文就作为一篇抄书笔记吧。

SCD简介

顾名思义,缓慢变化维度(slowly changing dimension, SCD)就是数据仓库维度表中,那些随时间变化比较不明显,但仍然会发生变化的维度。考虑以下两个情境:

  • 在员工维度表中,某员工原来在北京分公司工作,后来调往上海分公司,那么“工作地点”就是一个缓慢变化维度;
  • 在采购维度表中,办公电脑原来从戴尔供应商处进货,后来换成了联想,那么“供应商”就是一个缓慢变化维度。

处理缓慢变化维度是Kimball数仓体系中永恒的话题,因为数据仓库的本质,以及维度表在维度建模中的基础作用,我们几乎总是要跟踪维度的变更(change tracking),以保留历史,并提供准确的查询和分析结果。在《The Data Warehouse Toolkit, 3rd Edition》一书的第5章,Kimball提出了多种缓慢变化维度的类型和处理方法,其中前五种是原生的,后面的方法都是混合方法(hybrid techniques),因此下面来看看前五种,即Type 0~Type 4。

SCD Type 0: Retain Original(维持原状)

一种特殊的SCD类型,即不管维度属性的实际值如何变化,数仓中维度的值都会维持第一次的值。它主要适用于那些本身含义就是“原始值”(original)的维度,比如在用户维度表中,用户注册时使用的原始用户名(original_user_name)。如果它发生变化,那么变化后的值是无效的,会被抛弃。

SCD Type 1: Overwrite(覆盖)

最简单的SCD类型,即一旦维度属性的实际值发生变化,就会直接覆写到数仓中。数仓中的维度属性总是且仅仅保存着最近一次变更的值(most recent assignment)。书中的例子如下:

在上图中,Department Name维度发生了变化,并且新值直接覆盖了上一次的值。虽然它很容易实现,但是这样做会丢掉所有变更历史,并且在跨时域查询时,有可能会得到错误的结果。在实际操作中,这种方式几乎总是一种不良设计。

SCD Type 2: Add New Row(添加新行)

最主要、最常用的SCD类型,在我们日常以Hive为基础的数仓建设过程中,体现为拉链表技术。

这种类型在维度表中添加两个辅助列:该行的有效日期(effective date)和过期日期(expiration date),分别指示该行从哪个时间点开始生效,以及在哪个时间点过后会变为无效。每当一个或多个维度发生更改时,就创建一个新的行,新行包含有修改后的维度值,而旧行包含有修改前的维度值,且旧行的过期日期也会同步修改。书中的例子如下:

在上图中,当前有效列(current列)的过期日期会被记录为9999-12-31。当Department Name维度变化时,旧有的Product Key为12345的行的过期日期被更新为修改日期,并且新建了一个Key为25984的行,包含新的数据。

需要注意的是,这里的Product Key是所谓代理键(surrogate key),即不表示具体业务含义,而只是代表表内数据行的唯一ID。在处理SCD时,代理键可以直接用来区分同一自然键(natural key)的数据的新旧版本。上图中的SKU就是自然键。

这种类型的SCD处理方式能够非常有效且精确地保留历史与反映变更,但缺点是会造成数据的膨胀,因为即使只有一个维度变化,也要创建新行。

SCD Type 3: Add New Attribute(添加新属性列)

Type 2虽然非常好,但是当要在同一个时间维度内把新值和旧值关联起来时,就没有那么方便了。比如在上一节的表中,如果查询2013年2月1日以后的记录,就只能查到Department Name为“Strategy”的记录,而“Education”就被屏蔽了。Type 3就是一种与Type 2互补的类型。在Type 3的处理方法中,不会添加新行,而会添加一个新的属性列,该属性列中保存有对应维度的上一次变化的值。书中的例子如下:

在上图中新增了一个名称为“Prior Department Name”的列,保存着上一次变更的值。这样也解决了Type 2的数据膨胀问题,但是就只能保存一次变更历史,称为“变更现实”(alternate realities)。

另外仍然要注意,如果维度表中的许多维度都会发生类似的变更,那么就要新增很多列,这显然不太靠谱。所以这种类型经常用来处理那种变化可预测的(predictable)、“牵一发而动全身”的少数SCD。

当然,也可以根据实际需求新增多个列来保存多次变更历史:

SCD Type 4: Add Mini-Dimension(添加微维度)

当维度的变化没有那么“缓慢”时,前面三种类型的处理就都显得力不从心了(特别是对于规模非常大的维度表,比如有百万甚至千万行)。这种维度一般就不再称为SCD,而称为“快速变化维度”(rapidly changing dimensions, RCD)。当RCD的规模比较小时,还能够采用Type 2或者Type 3来撑着,但规模很大时,就只能采用Type 4了。Type 4的方式是将那些快速变化的维度从原来的大维度表中拆分出来单独处理,是为微维度(mini-dimension)。

以书中的内容为例,如果顾客维度中有一部分人口统计学(demographic)维度是RCD,就将它们拆成单独的维度表:

其中,微维度表的维度最好是少量、分段的(banded)离散值,例如:

SCD处理方式的对比

下表仍然来自《数据仓库工具箱》的原文。注意其中除了Type 0~4之外,还有三种混合方式,即Type 5~7。

最后善意提醒,《数据仓库工具箱(第三版)》这本书一定要读英文原版,千万不要读中译本。中译本错误百出,很多地方读起来都不通顺,令人窒息。

民那晚安~

聊聊数据仓库中的缓慢变化维度(SCD)相关推荐

  1. 数据仓库缓慢变化维度SCD?你想知道的都在这里

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好 ...

  2. 漫谈数据仓库之SCD(缓慢变化维度)

    0x01 什么是SCD? SCD(Slowly Changing Dimensions),中文一般翻译成"缓慢变化维". 缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的 ...

  3. 聊聊数据仓库中维度表设计的二三事

    前言 大家好,我是云祁!今天和大家聊聊数据仓库中维度表设计的那些事. 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化.维度层次.维度一致性.维度整合和拆分等)都会直接关系到维度建模 ...

  4. 缓慢变化维度(SCD)

    SCD简介 SCD Type 0: Retain Original(维持原状) SCD Type 1: Overwrite(覆盖) SCD Type 2: Add New Row(添加新行) SCD ...

  5. 数据仓库(9)数仓缓慢变化维度数据的处理

      数据仓库的重要特点之一是反映历史变化,所以如何处理维度的变化是维度设计的重要工作之一.缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流逝发生缓慢的变化,与数据增长较为快 ...

  6. 数据仓库之缓慢变化维度处理

    当维度数据发生变化时,有多种处理方式,一般会用缓慢变化维类型2来处理,也就是当维度属性发生变化时,新生成1行,同时添加 开始日期,结束日期 . 比如: 业务系统中的 用户表: userId mobil ...

  7. 一种基于SparkSQL的Hive数据仓库拉链表缓慢变化维(SCD2+SCD1)的示例实现

    背景 Hive 实现缓慢变化维,没有使用事务表的更新和删除操作(最新版本Hive已经支持,但需要Server/Client做相应配置,Hive实现的事务还有一定的局限性) Hive 自身的SQL使用M ...

  8. 数仓缓慢变化维SCD深度讲解

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

  9. 数据仓库系列 - 缓慢渐变维度SCD (Slowly Changing Dimension) 常见的三种类型及原型设计

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是在第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓 ...

最新文章

  1. RequireJS示例
  2. PyQt4编程之简短地做出多个选择框
  3. 「后端小伙伴来学前端了」Vue中利用全局事件总线改造 TodoList 案例
  4. Qt on android 蓝牙开发(控制小车)
  5. 10张逻辑思维图,迅速提升你的工作能力
  6. android 开发环境以及hello world,Android Studio开发环境搭建和HelloWorld
  7. mysql 如果存在修改_mysql如存在并发修改可能,一定要注意保证数据一致性
  8. 2017.9.5 组合数学 思考记录
  9. Google被骂成筛子
  10. python包管理工具pip_pip_python包管理工具(pip)下载 v9.0.1官方版 - 121下载站
  11. Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)
  12. 美化java界面,java课程设计界面美化包
  13. JxBrowser 7 Crack 申请试用教程
  14. 学计算机每天应该吃什么,一日三餐教电脑族缓解眼痛
  15. [Android 测试] 性能回归测试之 MonkeyRunner使用、插件扩展、结合批处理
  16. 植物大战僵尸原版完整版 免安装中文版
  17. u盘制作启动盘后容量变小
  18. 微信小程序普通二维码解析
  19. mybatis按姓名或手机号搜索
  20. 个人文件转移工具 v1.9.0.2107 系统目录迁移工具

热门文章

  1. 算力免费,还奖钱,OpenI日常激励活动“我为开源打榜狂”来袭
  2. OpenI的demo安装部署一
  3. 清华教授肝了368个小时整理出《Python3速查手册》高清PDF开发下载,零基础学习必备
  4. too many open files解决方案
  5. stm32中用到的实时系统_RALM: 实时 look-alike 算法在推荐系统中的应用
  6. 【C++】弧度转角度
  7. umi.js学习(一)、认识umi.js
  8. Oracle逻辑读详解
  9. android cordova原理,android 集成Cordova
  10. 2020年电工(高级)考试题库及电工(高级)考试内容