DataStage系列教程 (Slowly Changing Dimension)缓慢变化维

BI中维表的增量更新一般有2种:

  • Type 1:覆盖更改。记录的列值发生变化,直接update成最新记录。
  • Type 2:历史跟踪更改。记录值发生变化,将该记录置为失效,再insert一条新的记录。

这两种其实都可以通过sql的left join来实现,不过DataStage给我们提供一个组件,可以很好的实现这个功能,这就是slowly changing dimension。

1 缓慢变化维表示例

如图1所示,是一个常用的缓慢变化维,该表的进数逻辑为:

当记录新插入到改表时,STARTDATE是当前时间,ENDDATE为未来的某个时间或者为空,NOWSTATE为1;当业务数据反生修改时,维表中新增一条记录(与第一次插入时的逻辑一样),同时维表中业务主键(即CODE)相同的那条记录ENDDATE置为当前时间,NOWSTATE置为0。

图1 常用缓慢变化维示例

表DDL及说明如下:

CREATE TABLE D_EMPOLYEE
    (
        ID INTEGER PRIMARY KEY, --物理主键,代理键,递增,唯一
        CODE VARCHAR(20), --业务主键
        NAME VARCHAR(20),  --姓名
        PLACE VARCHAR(20),  --地址
        STARTDATE DATE,  --记录有效起始日期
        ENDDATE DATE default ‘9999-12-31‘,  --记录有效结束日期
        NOWSTATE CHAR(1)  --记录有效状态。1:有效;0:失效
    );

有同学可能想,为什么要多一个ID列的代理键。这种做法还是有一些好处的:

  • 节省空间:事实表只需要存维表的代理键,整型,一般都比逻辑键占用的空间少。
  • 关联快:数值,一般来说,关联起来要比一大串字符快一些。
  • 唯一确定记录:直接用该列关联就可以,不用再加状态或其他条件去唯一确定一条记录。

2 JOB示例

如图2,我们做出来的JOB最终是这个样子。

图2 JOB示例

大致分为以下几个部分:

  • 业务数据:数据来源。可以是业务库中表,也可以BI库中同步来的ODS表等。其中包含了我们维度表的基本信息。
  • BI库维度表(比对):BI库维度表,也是我们最终维度数据存储表。业务数据中包含的维度信息与它进行比较,确定记录是没有变化、修改了抑或是新增的。
  • slowly changing dimension stage:比较业务数据与维度表中数据。
  • BI维度表(目标):比较的结果最终反应在该表。与【BI维度表(比对)】是同一个表。
  • 选择性输出列:可以选择性的输出来自业务数据、BI库维度表(比对)、slowly changing dimension stage的部分列或所有列的数据。如果没有地方用到,可以不要该链接。

3 实现步骤

3.1 业务数据源

实际项目中,这些数据最初来源于业务系统数据。现在我们用一个文件来模拟。文件内容如下:

# cat fact.txt
code,name,place,salary
e_01,xie,CS,10
e_03,hei,BJ,9

3.2 BI库维表(比对)

从BI库读取维度数据,用于比对。该示例中表结构前文已给出。

3.3 BI库维表(目标)

和比对的维表是同一个表。需要注意2点:

  • 设置主键。物理主键。该示例为ID
  • Write mode 设置为 Update then insert

3.4 Slowly Changing Dimension

双击打开组件,在最下边有一个【快速路径】,如图3。一共5步,我们一步一步设置好就可以了。

注意:如果该组件只有一个输出链接的话,步骤将简化为3步。这里我们来讲一下5步的如何配置,3步的都包括在内了。

图3 快速路径

3.4.1 选择输出链接

该链接输出后续步骤中选择的需要输出的一些列。3步的为空就行,5步的选择非维表的那个。

图4 步骤1(选择输出链接)

3.4.2 查找键以及列用途设置

把业务键从左侧拖动到右侧键表达式对应位置,完成查找键设置。

列用途常用的分为以下几种:

  • 代理键(Surrogate Key)— 此列是维度表的主键,其中填充代理键的值。
  • 业务键(Business Key)— 此列是维度表所表示的业务对象的标识符,但它不是维度表的主键。此列通常用作查找列,并对应于源数据的某个键或其他一些字段,用于标识相关业务对象。查找的作用是找出与源数据行对应的维度表行。
  • Type 2— 选中此列表示值的更改。如果值发生了变化,则对维度表执行历史跟踪更改。
  • Type 1— 选中此列表示值的更改。如果值发生了变化,则对维度表执行覆盖更改。
  • Current Indicator— 此列的作用相当于一个标记,它指示特定业务键的记录是最新的。
  • Effective Date— 此列用于指定指定某记录在何时成为了最新的记录,也就是成为活动(active)记录。
  • Expiration Date— 此列用于指定记录处于活动状态的结束日期。对于当前活动的记录,该值通常是某个未来的日期,或者为 NULL。
  • SK Chain— 此列用于存储特定业务键历史中的上一条或下一条代理键。
  • (blank) — 此列在 SCD 处理中没有任何作用。在插入新行时,此字段中的数据将被插入到表中,但不会检查此列中的源数据的更改。

图5 步骤2(查找键以及列用途设置)

该例中,id为代理键;code为业务主键;name采用Type1更新策略,直接修改;place采用Type2历史跟踪策略,如果修改,则插入新记录。

3.4.3 代理键设置

这里提供了2种方式来生成代理键,分别为文件和数据库。这里只说一种文件的方式,数据库怎么实现,您可以自己实验一下。以后如果写代理键组件的文章,将会详细描述。

  • 输入名称:选择查找引用的链接。即BI库维表。
  • 源类型:Flat File
  • 源名称:Datastage服务器上的一个文件,需要事先创建。
  • 初始值:键值的起始值。
#生成键文件
touch /DS/Files/keyfile.dat 

#如果JOB执行时提示权限问题,则修改文件权限。图省事,就777了。
chmod 777  /DS/Files/keyfile.dat

图6 步骤3(代理键设置)

3.4.4 维更新设置

此处的数据流出到BI库维表。业务数据中需要用到的列对应映射到输出。接下来就是几个特殊列的派生值。

  • 代理键:在代理键所在行双击与派生值交叉的单元格,会自动填入一个函数:NextSurrogateKey();
  • 生效日期:设置为当前日期。双击单元格,手动填入函数:CurrentDate();
  • 截止日期:设置为未来的某个日期。这里填入‘9999-12-31‘;
  • 当前指示符:有效记录的标志。这里填入1;

图7 步骤4(维更新设置)

还需要设置记录失效时,截止日期和当前指示符的值,这里分别填入CurrentDate()和0。

3.4.5 输出映射设置

3步的没有这个步骤。

把需要的列从左边映射到右边输出就好了。

图8 步骤5(输出映射设置)

4 测试

接下就可以测试该JOB是否按照我们的想法生成数据了。主要应该包括以下情况:

  • 新增记录。也就是BI库维度表原来没有的记录,是不是正确的插入了该记录,起止日期、当前状态标志是否正确;
  • 更新记录。也就是BI库维度表已有的记录,设置了Type1、Type2的字段,数据源发生变化时,是否按正确的策略更新了。

提供一些测试数据:

# cat fact.txt
code,name,place,salary
e_01,xie,CS,10
e_03,hei,BJ,9

5 附JOB导出文件下载

点击下载:http://files.cnblogs.com/files/BlueBreeze/slowly_changing_dimension.rar

本文链接:http://www.cnblogs.com/BlueBreeze/p/datastage_series-Slowly_Changing_Dimension.html

时间: 2024-11-07 20:16:01

DataStage系列教程 (Slowly Changing Dimension)缓慢变化维的相关文章

缓慢变化维 (Slowly changing dimension)

      维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成"缓慢变化维",经常被简写为SCD.缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化.这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题. 个人感觉wiki上对缓慢变化维的定义比较详细,所以翻译此文并加入个人的观点看法.原文请参照 :http

使用SSIS Slow Changing Transformation组件管理缓慢变化维

最近尝试用SSIS自带的 Slow Changing Transformation组件处理缓慢变化维,看到有一篇文章写的很详细,就按照步骤进行操作同时进行翻译.原网址来自:Managing Slowly Changing Dimension with Slow Changing Transformation in SSIS. 介绍 作为数据库专家或者ETL的开发者你可能偶尔会碰到需要维护和管理缓慢变化唯的场景.在SQL Server中有多种方法来实现,最简单的是使用SSIS 数据流组件中的Slo

DataStage系列教程 by Bluebreeze

突发奇想,用了这么久的DataStage,想要写点东西祭奠那逝去的岁月.希望可以坚持一直写完. DataStage系列教程 (Change Capture) DataStage系列教程 (Pivot_Enterprise 行列转换)

缓慢变化维解决方案

缓慢变化维解决方案   Slowly Changing Dimensions (SCD) are dimensions that have data that slowly changes. 缓慢变化维:数据会发生缓慢变化的维度就叫"缓慢变化维". 举个例子就清楚了: 在一个零售业数据仓库中,事实表保存着各销售人员的销售记录,某天一个销售人员从北京分公司调到上海分公司了,那么如何来保存这个变化呢?也就是说销售人员维度要怎么恰当的处理这一变化.先来回答一个问题,为什么要处理,或保存这一变

关于数据仓库中缓慢变化维的总结

首先说一下概念,缓慢变化维(Slowly Changing Dimensions)指的是:维度表里面的数据并非是始终不变的,总会随着时间发生变化: 假设我们有一张我们公司的销售员维度表如下,记录了每个销售员的一些基本信息,那么随着时间的变化销售员可能会在各省公司间调岗,如将周杰伦调入北京分公司,针对这种变化,业务系统会直接将业务数据库中周杰伦的地址直接update为北京,而不会考虑历史变化,不过在数据仓库中由于有时我们需要进行历史变化分析,或者防止销售数据记录错误,所以需要对这种变化进行相应的处

OLAP --ODS 项目总结 -- 说说缓慢变化维

如果不是OLAP 系统或者BI系统,我们在生产环境下常遇到这样的问题 需要同步两个表.比如交通驾驶人,每个月需要同步. 表O_DRIVER_SOURCE 是来自第三方的源表,O_DRIVER_TARGET是本系统需要使用的目标表.现在需要同步这两个表很容易想到的 解决方案是 1.使用存储过程,有点复杂 2. merge into 语句 Merge into target O_DRIVER_TARGET Using O_DRIVER_SOURCE On ( O_DRIVER_SOURCE.driv

数据仓库专题(9)-缓慢变化维处理技术

一.案例描述 在一个零售业数据仓库中,事实表保存着各销售人员的销售记录,某天一个销售人员从北京分公司调到上海分公司了,那么如何来保存这个变化呢?也就是说销售人员维度要怎么恰当的处理这一变化. 先来回答一个问题,为什么要处理,或保存这一变化?如果我们要统计北京地区或上海地区的总销售情况的时候,这个销售人员的销售记录应该算在北京还是算在上海?当然是调离前的算在北京,调离后的算在上海,但是如标记这个销售人员所属区域?这里就需要处理一下这个维度的数据,即我们缓慢变化维需要做的事情. 二.解决方案 2.1

hive数仓中缓慢变化维

像用户的手机号,居住城市这些维度会变化的场景,会对用户维度表里面的数据造成影响,这种情况叫做缓慢变化维度. 1.需要跟踪最新变化,就更新数据为最新 2.需要保存历史数据的话, 就可以将主键设置为dwid 添加一个列 对应数据有效值(标识开始和过期时间) 3.维度需要的比较少的话,可以直接增加历史对应维度列(适合较少的维度值和变化度) 原文地址:https://www.cnblogs.com/tangsonghuai/p/11443588.html

DataStage系列教程 (Change Capture)

Change Capture可以比较具有相同列的数据集的差异,得出一个数据集(After)在另一个数据库(Before)的基础上产生的哪些变化.变化类型如表1: 变化代码 变化 中文说明 0 no change 无变化 1 insert 新增 2 delete 删除 3 edit 有变化 表1 变化种类 1 JOB示例 如图1,我们最终做出的JOB会是这个样子.它包含3个序列文件组件data_before.data_after.cmp_result:2个排序组件sort_before.sort_