使用kettle遇到的一些问题
kettle
kettle是一款开源的数据etl工具,用于做数据抽取和整合。其功能是很强大的。若要连接某个数据库,要先在kettle的lib目录下放入对应的jar包。
简单的数据表聚合输出
右键目录树,软件会卡死
原因是kettel和当前的jdk版本有冲突,同时,右上角无connect,无法连接资源库也是因为这个原因。我用的kettel8.2对应jdk9.0.4异常,更换为1.8.0是正常的。
方法:下载jdk1.8.0,更改系统的环境变量JAVA_HOME和PATH,重启电脑并重启kettle。
中文输出乱码
kettle的字符集默认是GBK,在进行数据库操作时,修改为utf8。建议每次新建数据库连接时都这样设置一下,防止不必要的麻烦。
右键数据库连接,编辑
在数据库连接中选择高级,下方输入set names utf8;
在数据库连接中选择,选项,characterEncoding选择utf8
创建并连接资源库后,右上角不显示
还是中文乱码问题,资源库名字中带有中文。
找到用户目录:C:\Users\hasee\.kettle\repositories.xml
将乱码修改为英文即可。
Kettle转换中,数据库连接和数据库查询的区别
先看两张测试数据表:
student表:
teacher表:
数据库查询(student作为表输入)
kettle效果:
sql命令查询效果(student左外连接teacher):
有同学是不是觉得这里一模一样啊,别急,接着往下看:
数据库查询(teacher表作为输入):
kettle效果:
sql查询效果(teacher左外连接student):
可以看出,kettle的表输入接数据库查询并不是单纯的左外连接,而是以表输入为主要对象,查询出第一个与之匹配的数据即返回,并将数据字段合并再主要对象后面。最终数据记录数与表输入项一致。
数据库连接(student表作为表输入)
连接详情:
kettle效果:
数据库连接(teacher表作为表输入)
连接详情:
kettle效果:
这里可以看出来,效果完全一样。
有同学猜到了,这就是典型的内连接:
sql查询语句:
数据库外连接(teacher表作为表输入)
那么我想使用数据库外连接应该怎样操作呢?细心的同学注意到在数据库连接步骤,有一个Outer join?
选项。勾选它试试:
kettle效果:
这样他的效果和左外连接就一模一样了。
总结:
kettle中的数据库查询,是指将输入表的每一项到数据库中作匹配,只返回第一个匹配到的结果。未匹配到返回空值。最后返回的数据记录和表输入记录数目一致。
而数据库连接默认是对应sql中的内连接。勾选Outer join?
之后是进行的左外连接。至于全连接,个人还在尝试。虽然可以通过kettle中的记录集连接
来完成,但是该步骤的排序和连接操作是在kettle内完成的,效率极其低下。