kettle使用java脚本处理前一步骤产生的多行数据 findInfoRowSet info_stream_tag

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

kettle中使用java脚本控件,对前一步骤产生的数据进行获取或处理,相信接触过的人都知道要用kettle自带的getRow()方法。如果前一节点只产生了一行数据,那我们简单的使用Object[] r = getRow()把这一行的数据放入数组r ,再用get(Fields.In, “a_fieldname”).getString®方法就可以得到相应字段的值了。
如果前一节点产生了多行数据,我们要在脚本中对多行数据逐一获取并处理,该如何实现呢?
今天在完成这个任务的时候就遇到了困难,上网查资料发现这方面的资料竟然没有,最后幸运的是在kettle官方的英文网站上查到了一篇文章,受到了启发,最终解决了问题。在这里分享一下经验。


一、仅处理一行是简单的

Object[] r = getRow();\\获取一行结果集,存入r数组
String foobar = get(Fields.In, "a_fieldname").getString(r); \\从数组r中拿到需要的字段的值

get(Fields.Out, "output_fieldname").setValue(r, foobar);\\把处理后的数据输出到一行中的指定字段
putRow(data.outputRowMeta, r);\\输出行
输出行以后,在下游节点中就可以通过output_fieldname字段得到处理后的数据并使用了

二、多行数据的逐行处理

代码如下(示例):

 RowSet infoStream = findInfoRowSet("getLocation");\\用自带的findInfoRowSet方法获取指定步骤step的结果集,存入名为infoStream的结果集中。
 \\这里findInfoRowSet函数的入参是重点,kettle把它称作info_stream_tag,就是由它去指定了需要获取前面的数据流中具体哪一个步骤的数据
 Object[] infoRow = null;\\定义一个空的数组,去临时存每一行的数据
 while((infoRow = getRowFrom(infoStream)) != null){\\循环用getRowFrom方法从结果集中取出每一行数据,存入infoRow数组,直到取完为止
	String filename = get(Fields.In, "Location").getString(infoRow);\\从数组中得到我们需要的字段的值
	try{
	\\处理得到的数据
	  }	catch (FileNotFoundException e) {  
            	e.printStackTrace();  
        	}  

	infoRow = createOutputRow(infoRow, data.outputRowMeta.size());\\创建输出数据用的行
	get(Fields.Out, "output").setValue(infoRow, filename);\\把处理后的数据填入待输出行中的指定字段
	putRow(data.outputRowMeta, infoRow); \\输出行 
 }

RowSet infoStream = findInfoRowSet(“getLocation”)这一句中,参数getLocation是在这里定义的

在脚本控件下方的“消息步骤”里,“步骤”列填写要获取结果数据的步骤的名称,标签列用于给这个步骤定义一个标签,即info_stream_tag,这个标签就是findInfoRowSet函数的入参。

脚本的完整代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  		
		RowSet infoStream = findInfoRowSet("getLocation");
   		Object[] infoRow = null;
    	while((infoRow = getRowFrom(infoStream)) != null){
		String filename = get(Fields.In, "Location").getString(infoRow);
		try{
		//处理数据的代码
		  }	catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  

		infoRow = createOutputRow(infoRow, data.outputRowMeta.size());
		get(Fields.Out, "filename").setValue(infoRow, filename);//输出数据
  		putRow(data.outputRowMeta, infoRow);  
   		 }		
  		return false;
}

附上给予我启发的文章链接:
https://help.hitachivantara.com/Documentation/Pentaho/8.2/Products/Data_Integration/Transformation_Step_Reference/User_Defined_Java_Class

Kettle款国外开源的ETL工具,它可以通过使用Java脚本来完成对数据流的操作。Java脚本使用Java语言编写的代码,内置了许多可以直接使用的函数。在Kettle中,Java脚本的主程序入口是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* [kettleJAVA脚本使用](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、付费专栏及课程。

余额充值