提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
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