Kettle中的【维度查询/更新】可以实现数据仓库中的缓慢变化维的两种更新方式:第一种是插入,另一种是更新。假设我们有一种演员表actor_1020,其表结构如下图1所示,actor_1020中的数据的内容如图2所示。
图1
图2
接下来,我们要在数据仓库中给actor_1020建立一张对应的维度表dim_actor_1021,该维度表的表结构如图3所示。目前dim_actor_1021的表是一张空表。
图3
下面,在Kettle中创建转换(如图4),将actor_1020中的数据更新到dim_actor_1021表中。
图4
下面需要对三个组件进行配置,关于【表输入】和【表输入 2】的配置不再详细说明了,其配置页面如图5、图6。
图5
图6
下面重点来看看【维度查询/更新】的配置,先来看图7
图7
图7中需要把【目标表】和【关键字】设置好。目标表即我们更新的维度表dim_actor_1021,关键字是用来对维度表中的数据和流里的字段进行匹配的。
图 8
运行该转换之后,dim_actor_1021表中的数据如图9。
图9
这里有几点需要特别注意:
- 截止日期字段 对应的最大年份,这个设置的为2199。我在其他数据仓库的资料中经常看到截止日期经常设置为‘9999-12-31’。这里我尝试了将最大年份改为9999。但是转换未能正确进行,提示 Data truncation: Datetime function: datetime field overflow,提示日期溢出。这主要是因为MySQL中Date类型的最大值为9999-12-31,而当在Kettle中设置最大年份为9999时,其往MySQL中传输的日期为10000-01-01,这已经超过了MySQL中Date的上限,所以报错。此处,可以输入的最大年份为9998. 将最大年份改为2199之后,将dim_actor_1021表清空,重新运行一遍该转换,其得到的dim_actor_1021表中的数据如图10(可以看到截止日期字段已经发生了改变)
图 10
- 开始日期字段可以自定义设置,需要勾选【使用另外一个可用的开始日期】。该选项提供了几种设置开始日期的方式,这里选择System Date。再将dim_actor_1021表中的数据清空,重新运行一遍转换,其得到的dim_actor_1021表中的数据如图11。
图 11
- 如果对actor_1020表中actor_id=5的数据进行更改(如图12),然后重新运行转换,最终dim_actor_1021表中的数据如图13。从图13中可以看到dim_actor_1021中新增了一条actor_id=5,actor_key=7的数据,此时这条数据是真正有效的数据,并且该条记录的verison_no变成了2。而原先的actor_key=6的记录中的截止日期字段已经从9999-01-01变成了2020-10-25。
图12
图13