Kettle 中文名称叫水壶,该项目的主程序员希望把各种数据放到一个壶里,然后以一种指定的格式流出。

Kettle是用来做数据迁移的,也就是将一个数据库中的数据全部导入另一个数据库,说起来简单,可是要是这两个数据库的表中的字段完全不同那怎么办呢,总不能简单的复制粘贴吧,所以就需要将表的字段名称甚至字段内容都进行一次转换,才可以解决问题。在这里关于Kettle的安装就不做说明了,主要是说说我的用法,也算是一个新手使用教程吧。

打开软件后,首先,我们先新建一个转换,ctrl+s进行保存,输入一个文件名,同时,第一次保存该文件时,文件名也会直接成为该转换的名称,然后选择一个自己能找到的地址就行了。

这时我们看左边,有两个页签可以切换,分别是主对象树和核心对象,主对象树就是当前的转换。核心对象相当于一个工具栏,里面有各种各样的工具。我主要用到的有:输入-表输入,转换-值映射,转换-字段选择,转换-增加常量,脚本-java代码,输出-表输出。

我们把所有上述的一个个小模块都给拖到主面板上,如图:

img

然后从第一个开始,首先单击第一个模块表输入,如图:

img

选择第四个带箭头的图标,然后会发现有个灰色的箭头随着你的鼠标移动,这时将鼠标移动到第二个模块值映射上,会发现箭头变蓝这时单击第二个模块值映射,会发现表输入和值映射之间多了一个蓝色箭头,有事需要选择主输出步骤。通过这种方式将所有模块串联。如图:

img

上图就代表了一个完整的表的数据交换,这时我们需要在左侧栏,点击主对象树,然后右击DB连接,选择新建,然后填入你的数据库连接信息,并测试,成功连接后点确认即可新建连接,如图:

这时,我们的准备工作基本已经就绪了,可以进行基本的数据迁移了,首先操作的是表输入,顾名思义,表输入代表的就是数据的来源,双击表输入,选择数据库连接,然后写上你要取数据的sql,然后点击预览,可以查看你查找到的数据,这时必须查看数据格式,因为部分字段,如:disabled,数据库中存的是0或1,但通过Kettle查找出来的数据中,disabled为Y或N。

 

img

一般来说,能够预览到数据说明你的sql是对的,也就可以进行下一步了。然后我们来操作下一步:值映射,值映射就是将某些值改成另一种值,比如将Y和N映射为1和0。双击值映射,首先选择使用的字段名,然后填上原值和目标值,点击确定即可。如图:

 

img

 

之后就是最重要的一步了:字段选择,由于数据迁移时,必定很多字段存在差异,那么如何将两张表中的字段一一对应呢,这是就可以通过字段选择将字段的名称修改成我们想要的。首先,双击字段选择,切换到第三个页签:元数据。然后点击右边的获取改变的字段,然后Kettle会将你sql中查询出来的字段一一列出,在改名成那列填上你现表中的字段,类型填上对应的类型,需要注意的是Integer代表Long,Number代表Double,同时,类型也可以不填,但不建议。填完后选择确定。如图:

 

img

这时,你会发现可能你现在的表中有很多字段是原表中没有的,但这些字段又是不可或缺,不能为空的,那么就需要用到增加常量这个模块了,可以填上名称,类型,长度,值(默认值),然后点击确定。如图:

 

img

在完成上部分操作后,基本字段是都可以对上了,但是,有些字段需要需要一些逻辑的处理,不能直接将取出来的值直接存入现表中,比如我自己的项目,我们的需求是将原来网站上的数据放到我们正在运维的新网站上,所以迁移过来的时候,现表已经存在数据,id就存在重复的现象,我们就把迁移过来的数据id直接改为负值,同时关联的id也要改为负值,这样就可以解决id重复,数据无法迁移的问题,同时关联关系也不会丢掉。这时候就需要用到java代码这个模块了,这里有个问题,Kettle自带的java代码模块不会自动导入jar包,所以建议先在MyEclipse中写好代码,然后复制过来,同时需要把导入的jar包复制过来。当然,导入的jar包必须在Kettle的文件夹下的lib文件夹中存在。在写代码的时候,可以在左侧栏中的input fields中双击getValue,这就是取值;在左侧栏中的output fields中双击setValue,这就是赋值。在写代码时,可以点击右下方的测试类来进行测试java代码。所以,java代码模块可以用来进行逻辑的处理,如图:

 

img

经过以上的步骤,我们的数据应该已经全部修改成新表格式的数据了,那么就可以进行最后一步表输出了,双击表输出,首先选择数据库连接,然后在目标表中写上要导出的那张表,注意不要勾选裁剪表,它会将表中原有数据删掉,然后点击数据库字段页签,如果需要字段有冗余,需要选择指定数据库字段,然后点击右方获取字段按钮,这时需要小心排查,需要将现表中没有的字段给删掉,右击,删除选中行就可以了。编辑完后确定,如图:

 

img

然后在主界面点击上方的运行按钮运行这个转换,运行成功如图:

img

若是没有错误出现,则代表转换运行成功。这时就可以去查看数据库中的数据有没有问题了,有问题可以再进行迭代调试。若是有错误出现,可以查看下方的执行结果中的日志页签,这里有比较详细的错误,可以协助你的调试。

以上操作基本可以满足数据迁移的全部需求了,多练练就行,接下来讲个拓展,有时候我们在执行完所有的转换操作后,还是无法满足需求,比如需要在数据转换之后进行一个sql来格式化某个字段。

第一种方法就是在执行完转换后,直接使用Navicat执行一个sql,可以满足需求,但需要额外的操作,其实Kettle也可以满足我们的这个需求,Kettle在核心对象的脚本中有一个执行sql脚本。但是,如果你直接拖到表输出的后一步,你的想法是执行完表输出后执行sql,但Kettle的机制是只要有sql是优先执行的,所以其实是在你插如数据之前执行了这段sql的。

那么,应该怎么做呢,那就要涉及到作业的概念了。作业是什么呢,简单理解就是很多个转换在一起,从上往下顺序执行,这不就可以解决我们的问题了么,首先我们先新建两个转换,一个是正常的数据迁移,第二个就放一个执行sql脚本的模块就可以了,写上你再数据迁移之后需要运行的sql。如图:

 

img

 

然后点击左上角文件,新建一个作业,我们只需要在核心对象中找到通用-START和通用-转换,然后拖一个START和两个转换到主面板,然后双击转换,第一个转换选择正常的数据迁移,第二个转换选择就一个执行sql脚本的转换,如图:

img

 

然后我们就可以运行这个作业了,运行成功后,即可实现先进行数据迁移,在执行sql的操作,如图:

img

以上操作就是我使用Kettle进行老数据迁移的心得,基本满足我的使用需求,希望也可以帮到大家。

 

 

更多推荐