Kettle 在应用中遇到的一些问题和解决方法
本文主要总结了 Kettle 在中文环境应用中遇到的一些问题, 问题列表还会不断增加. 这些问题都是 kettle fans 提供的,欢迎参与讨论.
问题1:
从excel 中抽取数据,插入到oracle 9 数据库中,报下面的错误.
2008/06/25 13:30:57 - 插入更新数据表.0 - Insert row: ![field1=1.3965E8, field2=1,798, field3=2002/05/27 00:00:00.000]
2008/06/25 13:30:57 - oracl - ERROR : java.sql.SQLException: ORA-01722: 无效数字
2008/06/25 13:30:57 - oracl - ERROR : at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
原因:
从错误信息可以看出,字段 "field2" 对应的数据是 1,798,该字段在数据库中是 Number 类型,Oracle 不能将 1,798 格式的字符串转换为数字。
解决方法:
在 【Excel输入步骤】-【字段】 标签下对应的字段设置为正确的类型。将 "field2" 设置为 "Number" 类型(默认是 String 类型)。
问题2: 由 sqlserver 向 mysql 迁移数据, 迁移以后的数据是乱码
原因: 这是由于mysql 的默认编码是 utf-8, 而中文环境下客户端的默认编码一般都是 gbk 或 gb18030, 由于客户端和服务器编码不一样导致保存到 mysql 的数据是乱码
解决方法: 在新建连接窗口中有一个选项(option) 标签, 在这个标签下可以设置数据库的一些连接参数. 在这里我们要设置 mysql 的客户端编码参数, 参数名characterEncoding, 参数值gbk.
问题3: 在 SQLServer 表输入步骤中使用以问号作为参数的 sql 语句 (参数的值从以前的步骤中获得),向 mysql 数据库导入数据 (使用 mysql 表输出步骤).
在执行的时候报告错误 Unable to get queryfields for SQL: AND e.LOCAL_TIME>? 00909 PRS INC Invalid character.
原因: 从错误语句看,是参数没有被替换掉, 因为发送给 mysql 服务器的是这样的语句 "AND e.LOCAL_TIME>?". 参数没有被替换掉是因为从以前步骤中读取的参数值是 null.
解决方法: 增加对 null 值的判断, 可以有两种方法, 如果这个值是从数据库获取的,一般的数据库都提供了处理null值的函数,如 mysql 的ISNULL 函数. 如果这个值是从其他步骤获得的,可以通过 Javascript 步骤进行判断并转换.
问题4: 使用 PDI 3.x 版本连接 DB2 数据库时会报下面的错误
Error connecting to database: (using class com.ibm.db2.jcc.DB2Driver)
encoding not supported!!
原因: PDI 自带的DB2 JDBC Driver 的版本比较低,无法连接 GBK 编码的 DB2 数据库。
解决方法: 将 DB2 数据库的编码改为 utf-8 编码。或者找高版本的 DB2 JDBC Driver 来代替 PDI 自带的DB2 JDBC Driver。
问题5: win2000 下运行,命令行太长导致spoon 或 kitchen 无法运行:
原因: spoon 运行时加载了太多的 jar,win2000 下对命令行的长度有限制
解决方法:1. 使用 java.ext.dirs 参数,将lib,libext,等 jar 路径都设置到这个参数下。
http://forums.pentaho.org/showthread.php?t=57843&page=2
2. 删除libext 目录下某些不需要的 jar,如各种数据库的jdbc driver
3. 使用 launcher 见
http://jira.pentaho.com/browse/PDI-559