kettle 中JAVA脚本的使用

Input fields

Java代码   收藏代码
  1. RowMetaInterface inputRowMeta = getInputRowMeta();  

 inputRowMeta对象包含了输入行的元数据,包括域、数据类型、长度、名字、格式等等。例如,查找名字为"customer"的域,可以采用如下方式:

Java代码   收藏代码
  1. ValueMetaInterface customer = inputRowMeta.searchValueMeta("customer");  

 在一个transformation里查找域的名字是很慢的,以为每一条都要查找。建议在第一条记录的时候预先查好:

Java代码   收藏代码
  1. if (first) {  
  2.     yearIndex = getInputRowMeta().indexOfValue(getParameter("YEAR")); 
  3.    //  getInputRowMeta().getString(r, getParameter("DATE"), null );(字符串类型)
  4.  //
  5.     if (yearIndex<0) {  
  6.         throw new KettleException("Year field not found in the input row, check parameter 'YEAR'\!");  
  7. }  
  8. }  

 例如:处理年份这个整形的时候可以这样:

Java代码   收藏代码
  1. Object[] r = getRow();  
  2. ...  
  3. Long year = inputRowMeta().getInteger(r, yearIndex);  

或者,用下面这种简单的方式

Java代码   收藏代码
  1. Long year = get(Fields.In, "year").getInteger(r);  

 

Output fields

可以在“Fields”选项里添加你想要的新域,这样会自动在data.outputRowMeta里增加输出的metadata。

Java代码   收藏代码
  1. Object[] outputRowData = RowDataUtil.resizeArray(r, data.outputRowMeta.size());  

 或者更便于记忆的方式:

Java代码   收藏代码
  1. Object[] outputRowData = createOutputRow(r, data.outputRowMeta.size());  

 

操作输出:

Java代码   收藏代码
  1. outputRowData[getInputRowMeta().size()] = easterDate(year.intValue());  

 或者简易的方式:

Java代码   收藏代码
  1. get(Fields.Out, "easter").setValue(r, easterDate(year.intValue());  
  2. IMPORTANT:  

 

以下例子是pentaho官方给出的UDJC例子,但是例子貌似出现了错误,本来是讲firstname拼上lastname,合出一个name字段输出,但是demo里最后一段是

Java代码   收藏代码
  1. putRow(data.outputRowMeta, r);  

而正确的输出应该是

Java代码   收藏代码
  1. putRow(data.outputRowMeta, outputRow);  

 

完整例子如下

Java代码   收藏代码
  1. String firstnameField;  
  2. String lastnameField;  
  3. String nameField;  
  4. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException  
  5. {  
  6. // 获取输入  
  7. //  
  8. Object[] r = getRow();  
  9. // 输入为空,直接false  
  10. //  
  11. if (r == null) {  
  12. setOutputDone();  
  13. return false;  
  14. }  
  15. // 处于性能考虑,parameter只查一次  
  16. //  
  17. if (first) {  
  18. firstnameField = getParameter("FIRSTNAME_FIELD");  
  19. lastnameField = getParameter("LASTNAME_FIELD");  
  20. nameField = getParameter("NAME_FIELD");  
  21. first=false;  
  22. }  
  23. // 用 createOutputRow() 来保证output的数组够大,能够装下任何新的域  
  24. //  
  25. Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());  
  26. String firstname = get(Fields.In, firstnameField).getString(r);  
  27. String lastname = get(Fields.In, lastnameField).getString(r);  
  28. // Set the value in the output field  
  29. //  
  30. String name = firstname+" "+lastname;  
  31. get(Fields.Out, nameField).setValue(outputRow, name);  
  32. // putRow will send the row on to the default output hop.  
  33. //  
  34. putRow(data.outputRowMeta, outputRow);  
  35. return true;  

Kettle是一款国外开源的ETL工具,它可以通过使用Java脚本来完成对数据流的操作。Java脚本使用Java语言编写的代码,内置了许多可以直接使用的函数。在KettleJava脚本的主程序入口是processRow()函数,它类似于Java的main方法,用于处理数据流。Kettle有两种脚本文件,分别是transformation和job。transformation用于完成针对数据的基础转换,而job则用于完成整个工作流的控制。因此,你可以在Kettle使用Java脚本来实现各种数据操作和转换。\[1\]\[2\] #### 引用[.reference_title] - *1* [Kettle8.2脚本组件之Java脚本](https://blog.csdn.net/sujiangming/article/details/115843390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JAVA调用Kettle脚本](https://blog.csdn.net/BUGdeQD/article/details/117733258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [kettle JAVA脚本使用](https://blog.csdn.net/fsp88927/article/details/24380299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值