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
DataStage系列教程 (Slowly Changing Dimension)缓慢变化维的更多相关文章
- 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式
开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...
- 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计
在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库中?在数据 ...
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- 缓慢变化维 (Slowly changing dimension)
维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成"缓慢变化维",经常被简写为SCD.缓慢变化维的提出是因为在现实世 ...
- DataStage系列教程 by Bluebreeze
突发奇想,用了这么久的DataStage,想要写点东西祭奠那逝去的岁月.希望可以坚持一直写完. DataStage系列教程 (Change Capture) DataStage系列教程 (Pivot_ ...
- ODI 11g & 12c中缓慢变化维(SCD)的处理机制
缓慢变化维(Slowly changing Dimensions)指的是维表中的维度字段值会随着时间或业务调整,而在后续的分析中,历史数据仍然要使用旧的维度值,新的数据会使用当前维度值.在数据仓库建设 ...
- DataStage系列教程 (Change Capture)
Change Capture可以比较具有相同列的数据集的差异,得出一个数据集(After)在另一个数据库(Before)的基础上产生的哪些变化.变化类型如表1: 变化代码 变化 中文说明 0 no c ...
- DataStage系列教程 (Pivot_Enterprise 行列转换)
有人提到Pivot_Enterprise这个组件,之前没有用过,今天捣腾了会,写下来供以后参考,如果有什么不对的,还请多指出,谢谢! Pivot_Enterprise主要用来进行行列转换. 1 示例 ...
- 如何用SQL语句处理缓慢变化维(渐变维,拉链表)SCD-2?
假设有一张居民维表,需要记录居民状态的变更历史,根据Kimball建模理论,设计居民维表如下: 另外在ODS中有居民信息的每日快照表(每天都记录一份居民的全量信息):O_USERINFO 如何将ODS ...
随机推荐
- [报错]Fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this
今天写了下面的快速枚举for循环代码,从按钮数组subButtons中取出button,然后修改button的样式,在添加到view中 for (UIButton *button in subButt ...
- Windows系统优化
1.关闭家庭组,因为这功能会导致硬盘和CPU处于高负荷状态: 关闭方法:windows + R 打开运行,输入services.msc回车,右侧窗格找到“HomeGroup Listener”和“Ho ...
- wait_event族函数浅析
2017-06-03 周末闲暇无事,聊聊内核中的wait_event*类函数的具体实现,等待事件必定涉及到某个条件,而这些函数的区别主要是等待后唤醒的方式……直奔主题,上源码 wait_event_i ...
- Python 有什么奇技淫巧?
知乎上有一个问题:Python 有什么奇技淫巧?其中有各种不按套路出牌的招数,也不乏一些惊为天人的"奇技淫巧",会让你大呼:居然还有这种操作??? 本文就是对日常使用过的或者觉得很 ...
- .........请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。
今天研究membership的时候出现的问题.在此记录一下. 解决办法就是,将"C:\Program Files (x86)\Microsoft Web Tools\Packages\Asp ...
- 执行Java脚本firefox启动成功,不运行test方法,且提示NullPointerException
在ideal中新建maven项目,将录制好的Java脚本文件,直接复制到项目中,添加相关的依赖脚本. 代码不报错之后,运行录制好的Java脚本,启动了firefox之后,不执行test方法,报错Nul ...
- windows批处理初学贴出一些命令
在cmd窗口中复制时,右键选标记,然后再选择此时选择区域就变白了.然后要么直接拖到要粘贴的地方,要么直接按回车存到剪贴板里. 1.循环导入文件夹下面的文件到数据库中 cd /d D:/Program ...
- hadoop streaming anaconda python 计算平均值
原始Liunx 的python版本不带numpy ,安装了anaconda 之后,使用hadoop streaming 时无法调用anaconda python , 后来发现是参数没设置好... 进 ...
- 一个辅助AWVS C段扫描的小php脚本
小菜写的小脚本,大牛轻拍砖~~~~~~ 渗透前信息收集时喜欢用椰树来获取旁站及二级域名,然后根据二级.三级域名地址扩展C段,扩大扫描业务边界.例如 以联想为例 但,各个旁站对应IP可能不同,或有CDN ...
- spark[源码]-SparkEnv执行环境创建
sparkEnv概述 sparkEnv是spark的执行环境,其中包括众多与Executor执行相关的对象.在local模式下Driver会创建Executor,local-cluster部署模式或者 ...