Data Flow SCD Type 2

1.基础版本只更新一个表

  • 创建一个sql表,用来存储数据Fifa数据
CREATE TABLE [dbo].[tbl_FIFAData](
    [SKey] [int] NOT NULL,
    [ID] [nvarchar](9) NOT NULL,
    [Name] [nvarchar](60) NOT NULL,
    [Age] [nvarchar](7) NULL,
    [Nationality] [nvarchar](60) NULL,
    [Club] [nvarchar](60) NULL,
    [Wage] [nvarchar](10) NULL,
    [PreferredFoot] [nvarchar](60) NULL,
    [Position] [nvarchar](60) NULL, 
    [Active] [int] NULL,
    [ActiveStartTime] [datetime2](7) NULL,
    [ActiveEndTime] [datetime2](7) NULL
) ON [PRIMARY]
GO
  • 具体流程


    image.png

    ①创建scd的参数;②分别创建两个source,一个是读取db里的旧数据,一个是读取blob里的新数据;③对newData和oldData的scd参数进行hash;④ 使用exists方法,对比新旧数据的哈希值,找到更新或者新增的所有数据;⑤为刚才改变的数据增加surrogateKey;⑥添加ActiveStatus的三个列;⑦选择有用的列;⑧找出只进行了更新操作的列

1. 创建scd的参数

创建一个SCD_ID参数,为了当数据进行更新时候使用;创建一个SDC_Columns参数,用来和旧的数据对比是否发生了变化

image.png

2. 创建source

创建一个读取sql里的旧数据的source 和一个读取blob里的新数据

3. 分别对newData和oldData里的SCD参数进行hash

使用Derived Column 分别生成对scd_id和scd_columns的hash列

image.png

注意:DataFlow里如果想要根据列名取数需要使用byname或者bynames方法

4. 使用exists方法获得所有改变了的数据

所有改变的数据包括了更新或者新增,所以我们的判断条件是scd_id和scd_columns,进行Doesn' t exists只获得newData变化的数据

image.png

5. 为发生改变的数据增加surrogateKey
  • 在newData分支创建一个名字为SKey的surrogateKey,刚好对应的是sql数据库里的SKey,但是这里有个bug,每次数据都是从1开始的,这不符合我们写入到sql表里的时候的需要接着旧表里的SKey。所以,我们需要首先读取到旧表里最大的SKey,然后加上新的SKey
  1. 计算oldData里的最大的SKey,直接使用Agggregate计算Max


    image.png

注意:这里的获取sql里的最大SKey的时候,一样使用了byname,由于他不是一个参数,所以SKey需要加引号,其次由于计算max需要的数字类型,原表里的是string,所以需要转换
2.newData里新建一个名字为SKey的surrogateKey,步长为1,起步为1,必须和sql表里的一致

image.png

3.join两个数据,将MaxSKey添加到每一行
image.png

注意:这里之所以使用cross join且条件是MaxSKey == SKey || true()的意思是永远都是真,其实就是想在所有的SKey后面添加一列MaxSKey,方便以后的计算
image.png

  1. 添加一个derived columns列,计算MaxSKey和SKey的和
    image.png

    注意:当首次使用的时候,由于旧表里的数据为空,所以计算出来的MaxSKey是null, 直接和SKey相加得到的也是null,所以使用iifnull()将null值转为0
6. 添加Active Status所需要的列

我们新增3个列,分别是Active表示该数据是否在使用,ActiveStartTime表示新数据写入的时间,ActiveEndTime表示数据什么时候结束使用的,null表示还在使用

image.png

注意:之所以这里的ActiveStartTime可以直接使用currentTime的原因是由于它使用的hash来区分新旧数据的,如果使用waterMarts方法的scd,时间必须是新数据表里的数据时间;如果想让时间类型显示为null,必须使用上面的写法

7. 使用select选择我们需要的列,删除不需要的列

这里我们使用role-based模式,使用表达式,直接排除我们不要列,留下有用的列。


image.png

至此,更新过的数据和新写入的数据的处理,我们都已经完成了,但是由于我们还需要将找出那些更新过的数据的,将Active Status 进行更新,例如将旧的数据的Active 状态改为0

8. 找出只进行了更新的列
  • 我们需要在oldData里的hash和newData里的已经匹配到的所有更新或者添加的数进行exists,这样就找到了oldData里哪些数据进行了更新
  1. 在hashOldData里派生出source
  2. 使用派生的source与newData里计算的所有更新或者更改的数据进行exists,判断的条件是hash_id,这样就可以找到,只进行了更新的数据,因为更新的数据他的ID没有变,是在原来的ID上面进行的操作


    image.png
9. 更改旧数据的状态为0
  • 这里,将旧数据Active改为0,并且将当前的时间添加为ActiveEndTime


    image.png
10. 选择相关的列

同上面一样

11. 使用alter rows确认更新
image.png
12. 使用alter rows在newData上确认insert
image.png
13. union 链接oldData的更新操作和newData的insert操纵
image.png
14. 设置sink将所有的插入和更新写入数据库
image.png

注意:这里在设置sink的时候,一定要将update勾选,不然会出现bug,无法更新;由于,更新时我们的标识符时ID字段,所以这里传入的时ID

2.动态的SCD typ2,对所有的表适用

  1. 更改上面的hard code的dataset,将dataset的信息写为动态的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容