Kettle中的【维度查询/更新】可以实现数据仓库中的缓慢变化维的两种更新方式:第一种是插入,另一种是更新。假设我们有一种演员表actor_1020,其表结构如下图1所示,actor_1020中的数据的内容如图2所示。


kettle 最新mysql驱动 kettle 更新_kettle 最新mysql驱动

图1

kettle 最新mysql驱动 kettle 更新_字段_02

图2

 接下来,我们要在数据仓库中给actor_1020建立一张对应的维度表dim_actor_1021,该维度表的表结构如图3所示。目前dim_actor_1021的表是一张空表。


kettle 最新mysql驱动 kettle 更新_kettle 最新mysql驱动_03

图3

下面,在Kettle中创建转换(如图4),将actor_1020中的数据更新到dim_actor_1021表中。


kettle 最新mysql驱动 kettle 更新_数据_04

图4

下面需要对三个组件进行配置,关于【表输入】和【表输入 2】的配置不再详细说明了,其配置页面如图5、图6。


kettle 最新mysql驱动 kettle 更新_字段_05

图5

kettle 最新mysql驱动 kettle 更新_数据仓库_06

图6

下面重点来看看【维度查询/更新】的配置,先来看图7


kettle 最新mysql驱动 kettle 更新_数据_07

图7

 图7中需要把【目标表】和【关键字】设置好。目标表即我们更新的维度表dim_actor_1021,关键字是用来对维度表中的数据和流里的字段进行匹配的。


kettle 最新mysql驱动 kettle 更新_字段_08

图 8

 运行该转换之后,dim_actor_1021表中的数据如图9。


kettle 最新mysql驱动 kettle 更新_kettle 最新mysql驱动_09

图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(可以看到截止日期字段已经发生了改变)

kettle 最新mysql驱动 kettle 更新_数据仓库_10

图 10

  • 开始日期字段可以自定义设置,需要勾选【使用另外一个可用的开始日期】。该选项提供了几种设置开始日期的方式,这里选择System Date。再将dim_actor_1021表中的数据清空,重新运行一遍转换,其得到的dim_actor_1021表中的数据如图11。

kettle 最新mysql驱动 kettle 更新_数据_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。

kettle 最新mysql驱动 kettle 更新_kettle 最新mysql驱动_12

图12

kettle 最新mysql驱动 kettle 更新_字段_13

图13