kettle 使用中的一些常见问题

  • 格式:docx
  • 大小:25.90 KB
  • 文档页数:7

kettle 使用中的一些常见问题问题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 : atoracle.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 路径都设置到这个参数下。

/showthread.php?t=57843&page=22. 删除libext 目录下某些不需要的jar,如各种数据库的jdbc driver3. 使用launcher 见/browse/PDI-559问题6: 关于资源文件kettle.property。

资源文件里的变量值如果有汉字,应该使用unicode 字符方式表示,即\uxxxx 的形式变量值里如果有"\" 符号,要转义为"\\"文本文件输入从文本文件中获得数据,常见的文本文件包括csv 、txt、文件等。

用户要在该步骤指定文件名、文件内容、错误处理方式、过滤器、字段等项目。

参数说明:l 指定文件名的三种方式1. 指定一个具体的文件名。

2. 指定一个正则表达式,来匹配一个目录下的文件。

3. 将其它步骤的运行结果作为文件名。

l 文件内容设置分隔符:指定字段之间的分隔符号文本限定符:指定一个字符串左右的限定符号,有限定符的字符串里可以使用分隔符。

有限定符的字符串内部如果要使用限定符,要将限定符加倍。

转义符:指定文本中的转义符号,用来将其后的字符转义。

页眉:指定页眉的行数,页眉行不作为数据行处理。

页脚:指定页脚的行数,页脚行不作为数据行处理。

回卷:说明一个数据行是否被回卷为多行。

l 错误处理设置忽略错误:是否忽略解析过程中产生的错误。

跳过错误行:是否跳过发生错误的行。

如果不跳过,那么发生错误的字段值会被置为空。

记录错误数的输出字段:指定一个输出字段用来记录解析错误的字段的个数。

记录错误描述的输出字段:指定一个输出字段用来记录发生错误的所有字段的名字。

记录错误字段名的输出字段:指定一个输出字段用来记录错误的描述信息。

警告文件目录:当发生警告时,警告将保存在这个指定的目录下。

错误文件目录:当发生警告时,警告将保存在这个指定的目录下。

失败行数文件目录:当读取行失败时,读取失败的行号将保存在这个指定的目录下。

l 过滤器过滤器:用来过滤输入行,符合过滤器条件的输入行将被忽略掉。

过滤字符串:用来去匹配输入数据的字符串(不支持正则表达式)过滤开始位置:指定字符串里开始匹配的位置,负数或0表示从第一个字符开始匹配。

停止处理:当遇到了匹配的字符串时,是否停止处理l 字段设定字段名称和数据类型使用kettle设计一些ETL任务时一些常见问题2009-07-27 10:55摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案1. Join我得到A 数据流(不管是基于文件或数据库),A包含field1 , field2 , field3 字段,然后我还有一个B数据流,B包含field4 , field5 , field6 , 我现在想把它们‘加’ 起来, 应该怎么样做.这是新手最容易犯错的一个地方,A数据流跟B数据流能够Join,肯定是它们包含join key ,join key 可以是一个字段也可以是多个字段。

如果两个数据流没有join key ,那么它们就是在做笛卡尔积,一般很少会这样。

比如你现在需要列出一个员工的姓名和他所在部门的姓名,如果这是在同一个数据库,大家都知道会在一个sql 里面加上where 限定条件,但是如果员工表和部门表在两个不同的数据流里面,尤其是数据源的来源是多个数据库的情况,我们一般是要使用Database Join 操作,然后用两个database table input 来表示输入流,一个输入是部门表的姓名,另一个是员工表的姓名,然后我们认为这两个表就可以”Join” 了,我们需要的输出的确是这两个字段,但是这两个字段的输出并不代表只需要这两个字段的输入,它们之间肯定是需要一个约束关系存在的。

另外,无论是在做Join , Merge , Update , Delete 这些常规操作的时候,都是先需要做一个compare 操作的,这个compare 操作都是针对compare key 的,无论两个表结构是不是一样的,比如employee 表和department 表,它们比较的依据就是employee 的外键department_id , 没有这个compare key 这两个表是不可能连接的起来的.. 对于两个表可能还有人知道是直接sql 来做连接,如果是多个输入数据源,然后是三个表,有人就开始迷茫了,A表一个字段,B 表一个字段,C表一个字段,然后就连Join操作都没有,直接database table output , 然后开始报错,报完错就到处找高手问,他们的数据库原理老师已经在吐血了。

如果是三个表连接,一个sql 不能搞定,就需要先两个表两个表的连接,通过两次compare key 连接之后得到你的输出,记住,你的输出并不能代表你的输入. 下面总结一下:1. 单数据源输入,直接用sql 做连接2. 多数据源输入,(可能是文本或是两个以上源数据库),用database join 操作.3. 三个表以上的多字段输出.2. Kettle的数据库连接模式Kettle的数据库连接是一个步骤里面控制一个单数据库连接,所以kettle的连接有数据库连接池,你可以在指定的数据库连接里面指定一开始连接池里面放多少个数据库连接,在创建数据库连接的时候就有Pooling 选项卡,里面可以指定最大连接数和初始连接数,这可以一定程度上提高速度.3. transaction我想在步骤A执行一个操作(更新或者插入),然后在经过若干个步骤之后,如果我发现某一个条件成立,我就提交所有的操作,如果失败,我就回滚,kettle 提供这种事务性的操作吗?Kettle里面是没有所谓事务的概念的,每个步骤都是自己管理自己的连接的,在这个步骤开始的时候打开数据库连接,在结束的时候关闭数据库连接,一个步骤是肯定不会跨session的(数据库里面的session), 另外,由于kettle是并行执行的,所以不可能把一个数据库连接打开很长时间不放,这样可能会造成锁出现,虽然不一定是死锁,但是对性能还是影响太大了。

ETL中的事务对性能影响也很大,所以不应该设计一种依赖与事务方式的ETL执行顺序,毕竟这不是OLTP,因为你可能一次需要提交的数据量是几百GB都有可能,任何一种数据库维持一个几百GB的回滚段性能都是会不大幅下降的.4. 我真的需要transaction 但又不想要一个很复杂的设计,能不能提供一个简单一点的方式Kettle 在3.0.2GA版中将推出一种新功能,在一个table output 步骤中有一个Miscellaneous 选项卡,其中有一个Use unique connections 的选项,如果你选中的话就可以得到一个transaction 的简单版,由于是使用的单数据库连接,所以可以有错误的时候回滚事务,不过要提醒一点是这种方式是以牺牲非常大的性能为前提条件的,对于太大的数据量是不适合的(个人仍然不建议使用这种方式)5. temporary 表如何使用我要在ETL过程中创建一个中间表,当某个条件成立的时候,我要把中间表的数据进行转换,当另一条件成立的时候我要对中间表进行另一个操作,我想使用数据库的临时表来操作,应该用什么步骤。