Kettle 转换与作业

写在前面

本文为本人在学习使用kettle进行数据迁移过程中的学习过程记录,仅供参考

Kettle 的转换与作业

转换(Transformation) 和 作业(Job)是Kettle描述数据转换过程的两个基本部件。

转换更着重于对数据内容进行处理,一个转换中可以包含多个步骤。一般来说,在一个转换中,各个组件是并行执行的。当一个组件的输入流接收到内容时,这个组件便进行工作,并将结果放入到输出流中。

相对而言,作业更加关心更为宏观的数据处理,比如文件和目录操作等等。一个作业可以包含多个作业项。作业和转换均可作为一个作业项,也就是说,一个作业可以包含多个子作业和转换。一个作业中的作业项之间是顺序执行的。对于一个作业项来说,只有当该作业项之前的所有作业项执行完毕后,才会执行该作业项。

为什么要用到作业

在之前,我只使用到了kettle的转换部件。最近我在迁移一个数据库表,需要根据表内的字段找到文件,读取文件内容并写到新数据库中。由于文件数量较多,文件又比较大,如果只使用转换的话,kettle会将文件内容一次性读入到内存里,而这样会超出内存限制,导致转换出错。

那如果我每次只取一条记录,读取一两个文件的内容并写入到数据库中,是不是就能够避免超出内存限制呢?

这种方法是可行的。而要做到每次只取一条记录,需要用到作业。在作业的“转换”和“作业”组件设置中, 有一个“执行每一个输入行”选项,勾选后,每输入一行记录,便执行一次该作业项,与我们上面的设想相符合。

注:据说在转换中一些组件也有“执行每一个输入行”这个选项,但目前我还没见过,实际效果未知。

kettle restcloud对比_文件名

作业项之间变量的传递

在Kettle中,有丰富的组件实现作业项之间变量的传递。

复制记录到结果(“转换”内组件)

该组件将当前的结果传递给下一个作业项。

复制文件到结果(“转换”内组件)

该组件将一个文件名传递给下一个作业项。

设置变量

该组件可以设置变量,并传递给下一个作业项。

获取变量(“转换”内组件)

该组件可以从上一个作业项中获取变量。

从结果中获取文件(“转换”内组件)

该组件可以从上一个作业项中获取文件名。

从结果中获取记录(“转换”内组件)

该组件可以从上一个作业项中获取相应记录的值。