文档章节

使用BO DI处理 SCD2维表

永和
 永和
发布于 2014/04/13 03:07
字数 1460
阅读 154
收藏 1

摘要:本文首先介绍了缓慢变化维的定义、三种处理方式。之后以员工维表数据为例,详细说明如何使用BO DI实现SCD2维表的ETL。最后讲解了SCD2维表如何使用。

 

1 缓慢变化维简介

某些维度的属性会随着时间缓慢变化,这种维度被称为缓慢变化维(Slowly Changing Dimension,SCD)。举个例子,跨国企业的员工可能会在不同区域间调动工作,但两次调动之间的时间间隔不会太短,因此员工的所属区域属性在缓慢变化,员工维是一个缓慢变化维。

 

在数据仓库中缓慢变化维如何建模,如何ETL呢?下面就以员工维表为例介绍三种常用的SCD处理方式。

1.1 SCD1:更新旧数据

SCD1 方式直接修改维度记录的属性值,维度属性表示员工当前状态。

 

假设企业内每个员工都隶属于某个地区,张三原属于亚洲地区。员工维表最初存储的数据如下表:

 

EMP_ID / 代理键

EMP_CODE / 员工代码

EMP_NAME / 员工姓名

REGION / 所属地区

1

A001

张三

Asia

 

    其中EMP_ID 是员工维表的主键,用于和事实表关联;EMP_CODE是员工代码,唯一地标识每位员工;REGION即员工所属地区。

 

现在因业务需要,张三被派驻到非洲地区了。在SCD1方式中,将张三的地区属性直接更新为"Africa",其余字段不变,事实表所引用的EMP_ID也无需变化。下表为员工维表修改后的情况,只有张三的所属地区属性被更新,维度记录表示张三当前的状态。

 

EMP_ID / 代理键

EMP_CODE / 员工代码

EMP_NAME / 员工姓名

REGION / 所属地区

1

A001

张三

Africa

 

SCD1是处理缓慢变化维最简单的方法,只有维表的属性字段需要修改,事实表数据不受影响。SCD1的缺点在于丢失了维度属性的历史数据;此外与变化属性有关的汇总数据必须重新计算,否则汇总与明细数据将无法对应。

 

维度属性的缓慢变化是否需要在数据仓库中体现是根据分析需求而定的。这类需求在调研阶段很容易被业务用户忽略,因此建模人员应检查每个维度属性是否有变化的可能,以及是否有分析历史信息的需要。不要想当然地把SCD1作为默认的维度处理方法。

1.2 SCD2:增加新记录

    SCD2方式使用新记录存储更新的维度信息,能够保存维度历史信息,因此是最主要的缓慢变化维处理方式。

 

我们继续使用在区域间调动工作的例子。张三于2007年5月从亚洲调动到非洲后,使用SCD2方式存储的维表如下所示:

 

EMP_ID / 代理键

EMP_CODE / 员工代码

EMP_NAME / 员工姓名

REGION / 所属地区

1

A001

张三

Asia

2

A001

张三

Africa

 

张三原有记录不变,增加一条新记录作为张三最新的信息。新记录的所属地区字段值为"Africa",新记录的EMP_ID字段值是自动生成的代理键。事实表中张三2007年5月之前的事实数据使用旧EMP_ID(1),2007年5月之后的事实数据使用新记录的EMP_ID(2)。

 

SCD2方式实际上存储了同一员工在不同时间的多个版本的信息,自动生成的EMP_ID可以唯一地标识不同版本,而逻辑上唯一的EMP_CODE显示了同一员工不同版本信息间的联系。

 

需要注意的是,SCD2维表与事实表关联时无需附加任何日期时间条件,因为在抽取事实数据时就已经选择了与事实数据时间相匹配的维度EMP_ID。在SCD2维表中可以加入"信息生效时间戳"和"信息失效时间戳"两个字段,通过这两个字段就可以还原出任意时间点员工信息的快照。在SCD2维表中还可以加入"当前有效信息标志",便于查询出最新版本的维度信息。

1.3 SCD3:增加新数据列

SCD3方式使用新数据列存储更新的维度信息,能够保存有限的维度历史信息。

 

    仍旧用张三调动所属区域的例子,使用SCD3方式存储的维表如下所示:

 

EMP_ID / 代理键

EMP_CODE / 员工代码

EMP_NAME / 员工姓名

REGION / 所属地区

REGION_PRIOR / 之前的所属地区

1

A001

张三

Africa

Asia

 

    员工维表增加了一列REGION_PRIOR,此列存储张三的旧所属地区属性"Asia",而REGION字段则存储新所属地区属性"Africa"。

 

    有些分析要求同时按维度的新旧属性查看事实数据。比较常见的例子是销售区域划分发生变化后,分析人员希望既能按划分后的区域查看事实数据,也能按划分前的区域查看。只有SCD3能满足此类需求。 

1.4 小结

以上是对三种SCD方式的介绍。这三种方式的出场顺序没有任何含义,不代表谁好谁差。三种方式各有优劣,开发者应该根据数据的特点、分析的要求来选择。

 

以上述三种SCD方式为基础,还可以形成多种混合SCD方法,使维度数据满足更特殊的分析要求。本文不详细介绍了,深入了解可以参考《Data warehouse toolkit》,p102-105,Hybrid Slowly Changing Dimension Techniques。

© 著作权归作者所有

共有 人打赏支持
永和

永和

粉丝 810
博文 20
码字总数 9162
作品 0
广州
产品经理
私信 提问
维度处理-数据仓库-读书笔记(四)

数据仓库中如何使用一致性维度集成 一致性维度 1,当不同的维度表的属性具有相同的列名和领域内容时候,称为维度具有一致性 2,有利于不同事实表的合并到同一报表中去 3,在一致性维度的前提...

数据僧
08/22
0
0
基于Hadoop生态圈的数据仓库实践 —— ETL(二)

二、使用Hive转换、装载数据 1. Hive简介 (1)Hive是什么 Hive是一个数据仓库软件,使用SQL读、写、管理分布式存储上的大数据集。它建立在Hadoop之上,具有以下功能和特点: 通过SQL方便地访...

wzy0623
2016/07/06
0
0
HAWQ取代传统数仓实践(三)——初始ETL(Sqoop、HAWQ)

一、用sqoop用户建立初始抽取脚本 本示例要用Sqoop将MySQL的数据抽取到HDFS上的指定目录,然后利用HAWQ外部表功能将HDFS数据文件装载到内部表中。表1汇总了示例中维度表和事实表用到的源数据...

wzy0623
2017/05/12
0
0
数据仓库-高级维度表技术-读书笔记六

高级维度技术 维度表连接 维度表可以包含到其他维度表的引用。虽然可以使用支架表实现。某些情况下存在于基本维度上的指向支架维度的外键的存在导致基本维度爆炸性增长。 比较的做法是将支架...

数据僧
08/25
0
0
HAWQ取代传统数仓实践(六)——增加列

业务的扩展或变化是不可避免的,尤其像互联网行业,需求变更已经成为常态,唯一不变的就是变化本身,其中最常碰到的扩展是给一个已经存在的表曾加列。 以销售订单为例,假设因为业务需要,在...

wzy0623
2017/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RabbitMQ+PHP 教程三(Publish/Subscribe)用yii2测试通过

介绍 在前面的教程中,我们创建了一个工作队列。工作队列背后的假设是每个任务都交付给一个工作人员处理。在这一部分中,我们将做一些完全不同的事情——我们将向多个消费者发送消息。此模式...

hansonwong
23分钟前
2
0
关于JAVA你必须知道的那些事(四):单例模式和多态

好吧,今天一定要把面向对象的最后一个特性:多态,给说完。不过我们先来聊一聊设计模式,因为它很重要。 设计模式 官方的解释是,设计模式是:一套被反复使用,多数人知晓的,经过分类编目,...

拾光TM
23分钟前
1
0
ES6 系列之 Babel 是如何编译 Class 的(下)

摘要: ## 前言 在上一篇 [《 ES6 系列 Babel 是如何编译 Class 的(上)》](https://github.com/mqyqingfeng/Blog/issues/105),我们知道了 Babel 是如何编译 Class 的,这篇我们学习 Babel ...

阿里云官方博客
24分钟前
1
0
附实例!实现iframe父窗体与子窗体的通信

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本...

腾讯云加社区
30分钟前
1
0
JSP页面传List集合到Action中

1:JSP页面(前端用的是H-UI框架) <div class="codeView docs-example"> <table class="table table-border table-bordered table-striped"> <thead> ......

uug
33分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部