ETL的使用过程中遇到的坑

一、ETL中的中文乱码问题:

1. 解决方法打开数据库连接

在选项的命令参数添加第三行参数配置:characterEncoding 值为utf-8

注意:ETL中出现的任何中文,包括流中表头即列名是中文在保存到资源库中都会乱码,暂时没有找到好的解决方案,只能在ETL程序中不用中文。

2. ETL的插入更新组件使用注意事项

插入更新组件的逻辑是如果满足上面表格的条件则进行更新,不满足就进行插入操作,下面的写法是错误的,我们应该要去掉STATISTICS_ITEM_VALUE<>STATISTICS_ITEM_VALUE这个判断条件,不然值如果没有改变会进行插入操作

3. TINYINT类型数据,IS_ENABLE,在SQL语句中可以用IS_ENABLE=1正确判断,但是查询出来的1变成了Y,0变成了N,目前没有好的解决办法,只能在查询出来以后使用的时候注意判断。

4. 使用sort组件的时候需要注意死锁问题,kettle默认是每次处理1000条记录,sort组件要等全部数据全部进来以后才会往下执行,而如果有其它的组件与sort组件并列,其它的组件先执行完了数据,还要等sort组件处理完数据合并的情况就会造成死锁。例如总共有5000条记录,第1000条记录成功到达sort组件和并列组件中,因为并列组件还要等待sort组件处理后的数据进行合并已经存储了1000条记录,下一个1000条记录能够成功到达sort组件,但是却不能够再到达并列组件中,所以造成了死锁。参考: http://wiki.pentaho.com/display/EAI/Transformation+Deadlocks

5. 如果在作业中有循环操作的话,在循环内部的转换中不能使用 java控件 。使用java控件的时候,可以执行循环的第一次,第二次执行循环的时候,就会报出初始化java失败的错误信息,如下:

- Java 代码.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : Error initializing UserDefinedJavaClass:
2017/04/21 16:36:14 - Java 代码.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleException: 
2017/04/21 16:36:14 - Java 代码.0 - null
2017/04/21 16:36:14 - Java 代码.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 错误初始化步骤[Java 代码]
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 步骤 [Java 代码.0] 初始化失败!
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : Unable to prepare for execution of the transformation
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleException: 
2017/04/21 16:36:14 - ktr_set_search_candition - 无法初始化至少一个步骤. 执行无法开始!

6. 在js控件中不能使用 JSON 对象来处理字符串转json的操作,如下语句。

JSONArray obj = new JSONArray().fromObject(string);

这种方式在通过使用Kettle编辑etl以及执行的时候是没有问题的。但是通过程序调用的时候,是不行的。程序报错信息是不认识 JSON 这种情况下找到一种解决方案:使用 eval("("+ETL_VARIABLES+")") 可以实现字符串转成json格式的操作。使用这种方式的话,就必须在java中保证入参的字符串必须是json格式的。否则经过转换之后就会存在问题。参考:http://www.cnblogs.com/Liujunyan/p/4965924.html

7. 在执行ETL的时候,会有传参,但是可以在 Kettle.properties 中设置参数,也可以在环境变量中设置参数,同时还可以在程序调用的时候参入参数,这些优先级如下:Kettle.properties > 环境变量参数 > 程序入参。所以在程序调用执行的时候,要避免其它两种方式对入参的干扰。

8. 设置全局变量的问题:在某些转换中需要生成一些全局的变量的时候,一定要在"设置环境变量"这个控件中,把前面操作产生的变量提成全局的。尤其在执行循环的时候,要把是否替换值设置对。否则循环变量就增加不上去。

9. 缓存的问题。

    etl通过Kettle执行之后,会有缓存。需要把缓存清掉,再使用程序调用。在Kettle.properties里面设置的参数,在程序调用的时候是会发生影响的。

10. 在一个转换中,如果有多条之路,但是某一条之路执行发生错误的话,是会影响其它分支的执行的。

猜你喜欢

转载自my.oschina.net/ChinaHaoYuFei/blog/1790763