kettle之缓慢变化维

作者: bf3780a4db09 | 来源:发表于2019-06-19 09:13 被阅读43次

    参考网址:https://www.cnblogs.com/charisna/p/4673866.html
    关于缓慢变化维的概念可以参考上面这个网址,现在用kettle官方例子samples/jobs/Slowly Changing Dimension体验一下如何处理缓慢变化维。
    主流程如下:

    image.png
    1、检验table是否存在,如果存在,先把表清空,做维度/查询更新;如果不存在,新建table;
    2、插入数据之后,再进行维度查询/更新,根据匹配情况和更新方式,更新表中数据。
    第一个转换流程如下:
    image.png
    其中获取系统信息内容如下:用来指定流日期字段类型
    image.png
    维度查询和更新如下:
    image.png
    image.png
    image.png
    1、更新维度吗?这个如果没有勾选,当找到符合条件记录的时候,就是插入新纪录而不是更新
    2、关键字字段id相等时,Name和Firstname字段进行更新,查询更新字段不包括前面的关键字字段
    3、stream日期字段,你可以指定维记录最后一次被更改的时间,它能指定你要更新的维的精度,如果不指定,就会默认是系统时间,这里指定的是字段updated;
    首先只运行到第一个查询更新步骤,得到如下结果:
    image.png
    customer_tk是代理主键,version是版本号,date_from和date_to分别为有效期起始和失效时间;相同id,其他字段不同的记录version不同,类似于一个序列,date_from和date_to的格式与updated字段一致,此外
    注:第一行有一个代理主键等于1,版本好等于1,剩余字段为空的记录(后面测试了一下,如果删除这条记录,再运行一次,仍然会出现这条记录,当表中存在这条记录时,再运行就不会出现新的这种记录,即运行维度查询/更新控件,表中必须有一条这样的记录)
    看到有人说是因为这个原因:
    假设一个产品销售的记录是作为一个立方体的主要事实表,它包括一个客户维,现在因为某种原因客户维需要删除掉一部分数据,但是对应的产品销售记录却要保存起来,该如何处理外键约束的问题?
    SCD实现本身并不会考虑这个问题,因为它跟维表没有什么关系,你要处理的是事实表里面那些引用了维表的记录,如果你没有这个空行(它唯一的一个值就是 id (这里指的应该是代理主键customer_tk吧),而且是为了满足主键约束,version那个字段有没有值不重要),事实表中的记录就不好处理这种情况,因为你把它赋予任何一个值都是不合适的。这种方法是为了处理像数据依赖(外键的关系)和错误处理比较常见的方法。
    说实话,我刚开始没有理解这段话的意思,今天又看到另一段类似的解释:
    另外需要考虑的是维表的数据删除了,对应的事实表或其他依赖于此维表的表的数据如何处理,外键约束可能不太容易去掉,或者说一旦去掉了就可能再加上去了,这可能需要先处理好事实表的依赖数据,主要是看你如何应用,如果只是简单的删除事实表数据的话还比较简单,但是如果需要保留事实表相应记录,可以在维表中增加一条记录,这条记录只有一个主键,其他字段为空,当我们删除了维表数据后,事实表的数据就更新指向这条空的维表记录。我理解的意思是,需要有一条记录来对应那些在维表中删除的数据,如果这条记录不存在,事实表中也没有其他合适的记录来匹配那些维表中删除的记录。
    后面是几种不同的更新方法:
    这个第一个转换产生的结果相当于是维字段,流字段如下:
    image.png
    勾选更新维度,第一种insert:( Type II)
    结果:
    当id相同时,待更新字段至少有一个不同的,就认为两条记录不同,将该条记录插入,version字段也加1
    :如果要指定stream日期字段,它指定了同一个ID最新版本的有效时间,针对ID=100的记录,当前表中有三个版本,第三个版本的有效时间是当前系统时间,如果你在第二个转换中指定的该日期字段小于当前最新版本的有效时间,比如指定stream日期字段为‘昨天 00:00:00’,就会出现这个结果,新传入的记录版本号等于2
    image.png
    如果将第二个转换的stream日期字段设置为‘今天 00:00:00’,结果就好了
    image.png
    关于date_from和date_to的改变,以ID=102的记录为例:
    原数据如下
    date_from date_to id Name Firstname
    1900-01-01 00:00:00 2200-01-01 00:00:00 102 Bleuel Jens
    更新之后:
    date_from date_to id Name Firstname
    1900-01-01 00:00:00 2019-06-19 00:00:00 102 Bleuel Jens
    2019-06-19 00:00:00 2400-01-01 00:00:00 102 Bleuel Jens2
    kettle官方文档是这样解释的:
    image.png
    当前行(原数据)的date_to字段用stream日期字段替代,即2200-01-01 00:00:00被修改为2019-06-19 00:00:00;
    新行(插入的数据)date_from用stream日期字段替代,即2019-06-19 00:00:00,date_to字段用表中日期的最大值替代,这个最大值应该是你设置的date_to的最大值。
    第二种更新方式为update(最新版本被更新),结果如下:
    image.png

    ID等于100 的记录,当前表中的最新版本(Casters、Matt)第三个版本被更新(Casters2、Matt2);
    ID等于102的记录,当前表中的最新版本(Bleuel、Jens)第三个版本被更新(Bleuel、Jens2)。
    第三种更新方式等于Punch through(所有版本都被更新成同一个新版本,Type I),结果如下:

    image.png
    ID等于100 的记录,都被更新成(Casters2、Matt2);
    ID等于102的记录,被更新成(Bleuel、Jens2)。
    如果待更新字段均相同,则不会发生插入或者更新。还有其他方式没怎么试过就不说了。
    还有很多细节可以看官方文档:https://wiki.pentaho.com/display/EAI/Dimension+Lookup-Update

    相关文章

      网友评论

        本文标题:kettle之缓慢变化维

        本文链接:https://www.haomeiwen.com/subject/tvxzfctx.html