前言:
本文主要讲解用Datastage 实现缓慢变化维具体步骤,以(Type 2 SCD 保存多条记录,增加时间戳或有效标示区分)为实现目标,至于缓慢变化维理论以及代理键好处都不一一列举。理论部分推荐以下博客去了解:
缓慢变化维完全解决方案
缓慢变化维的处理
环境信息:
版本:IBM InfoSphere DataStage V11.3.1
操作系统:linux redhat 6.4
概念:
缓慢变化维定义
Dimension is a term in data management and data warehousing thatrefers to logical groupings of data such as geographical location,customer information, or product information.
Slowly Changing Dimensions (SCD) are dimensions that have datathat slowly changes.
百度百科中是这样定义的:在维度建模的数据仓库中,有一个概念叫Slowly ChangingDimensions,中文一般翻译成“缓慢变化维”,经常被简写为SCD。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题
数据仓库中缓慢变化维三种类型:
Type 1 SCD :新数据覆盖旧数据
Type 2 SCD :保存多条记录,增加时间戳或有效标示区分
Type 3 SCD :它只能保存两次变化记录.适用于变化不超过两次的维度。
实现内容:
以客户维表为例:当客户所属单位名称发生变更时候,我们对客户维表的记录。及保留历史数据,并要求对时间戳和有效标示做处理。
设计思路:
1.利用Change Capture 控件对数据源和已经生成的维表DM_PBI_CUSTOMER_D 做对比,利用字段Changecode,分别获取新增,更新,删除动作的数据。
Changecode用以表示数据变化的情况(0:Copy 1:Insert 2:Delete 3:Edit)。
2.利用Transformer Stage控件将对应的数据进行分流,并在对应的 Oracle_Connector 做相应的操作。
3:注意:
其中利用Copy控件获取的源数据和LookUp更新的数据 通过主键获取对应的代理键 更新相应的标示,同时对新更新的数据进行插入。
4:在控件中增加代码:采用 ORCHESTRATE.parameter_name
即绑定变量参数。
具体实现:
自定义SQL:
本案例采用缓慢变化 Type 2 SCD 其中字段含义如下:其中生效日期默认为 系统Sysdate 失效日期默认为 9999-12-31 其中代理键为CUSTOMER_KEY,数据由序列号生成。
其中如果源库发生删除数据则需要对目标表DM_PBI_CUSTOMER_D 做对应更新删除标示,更新有效标示和失效日期等动作。
UPDATE DM_PBI_CUSTOMER_D D
SET DEL_FLAG = 'Y',
END_DATE = SYSDATE ,
D.VALID_FLAG = 0 ,
D.LAST_UPDATE_DATE=ORCHESTRATE.LAST_UPDATE_DATE
WHERE D.CUSTOMER_ID = ORCHESTRATE.CUSTOMER_ID
对新录入的数据进行插入:
INSERT INTO DM_PBI_CUSTOMER_D
(CUSTOMER_KEY,
CUSTOMER_ID,
CUSTOMER_NAME,
BENIFITERTYPE,
ORG_CODE,
AREA_NAME,
AREA_LEVEL,
FINANCING_COST,
ISPLATFORM,
CARDTYPE,
CARDNO,
TELEPHONE,
FAX,
ELECTRONIC_MAIL,
POSTCODE,
ADDRESSCONTENT,
START_DATE,
END_DATE,
VALID_FLAG,
DEL_FLAG,
LAST_UPDATE_DATE)
VALUES
(DIM_CUSTOMER_S.NEXTVAL,
ORCHESTRATE.CUSTOMER_ID,
ORCHESTRATE.CUSTOMER_NAME,
ORCHESTRATE.BENIFITERTYPE,
ORCHESTRATE.ORG_CODE,
ORCHESTRATE.AREA_NAME,
ORCHESTRATE.AREA_LEVEL,
ORCHESTRATE.FINANCING_COST,
ORCHESTRATE.ISPLATFORM,
ORCHESTRATE.CARDTYPE,
ORCHESTRATE.CARDNO,
ORCHESTRATE.TELEPHONE,
ORCHESTRATE.FAX,
ORCHESTRATE.ELECTRONIC_MAIL,
ORCHESTRATE.POSTCODE,
ORCHESTRATE.ADDRESSCONTENT,
ORCHESTRATE.START_DATE,
ORCHESTRATE.END_DATE,
ORCHESTRATE.VALID_FLAG,
ORCHESTRATE.DEL_FLAG,
ORCHESTRATE.LAST_UPDATE_DATE);
对更新的数据,同时实现对表已有数据进行更新并对更新数据进行加载:
begin
UPDATE DM_PBI_CUSTOMER_D D
SET VALID_FLAG = 0,
END_DATE = SYSDATE,
D.LAST_UPDATE_DATE = ORCHESTRATE.LAST_UPDATE_DATE
WHERE D.CUSTOMER_KEY = ORCHESTRATE.CUSTOMER_KEY;
INSERT INTO DM_PBI_CUSTOMER_D
(CUSTOMER_KEY,
CUSTOMER_ID,
CUSTOMER_NAME,
BENIFITERTYPE,
ORG_CODE,
AREA_NAME,
AREA_LEVEL,
FINANCING_COST,
ISPLATFORM,
CARDTYPE,
CARDNO,
TELEPHONE,
FAX,
ELECTRONIC_MAIL,
POSTCODE,
ADDRESSCONTENT,
START_DATE,
END_DATE,
VALID_FLAG,
DEL_FLAG,
LAST_UPDATE_DATE)
VALUES
(DIM_CUSTOMER_S.NEXTVAL,
ORCHESTRATE.CUSTOMER_ID,
ORCHESTRATE.CUSTOMER_NAME,
ORCHESTRATE.BENIFITERTYPE,
ORCHESTRATE.ORG_CODE,
ORCHESTRATE.AREA_NAME,
ORCHESTRATE.AREA_LEVEL,
ORCHESTRATE.FINANCING_COST,
ORCHESTRATE.ISPLATFORM,
ORCHESTRATE.CARDTYPE,
ORCHESTRATE.CARDNO,
ORCHESTRATE.TELEPHONE,
ORCHESTRATE.FAX,
ORCHESTRATE.ELECTRONIC_MAIL,
ORCHESTRATE.POSTCODE,
ORCHESTRATE.ADDRESSCONTENT,
ORCHESTRATE.START_DATE,
to_date('9999-12-31','yyyy-mm-dd'),
ORCHESTRATE.VALID_FLAG,
ORCHESTRATE.DEL_FLAG,
ORCHESTRATE.LAST_UPDATE_DATE);
end;
控件设置:
a)Change Capture 设置如下:
Explicit Keys , All Values:用户显示定义Key,After中其余所有字段为Value,除了用户显示排除的字段。
b)Transformer Stage 设置如下:利用Transformer Stage控件将对应的数据进行分流,并把更新相应的时间戳已经标示
c)其中利用Copy控件获取的源数据和LookUp更新的数据通过主键获取对应的代理键更新相应的标示,同时对新更新的数据进行插入。
实现效果:
源数据:
如果字段 将客户名称 招商银行股份有限公司-SJM 更改成 招商银行股份有限公司 如下:
最终记录值: