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

您所在的位置:网站首页 使用java数组的两个步骤 kettle使用java脚本处理前一步骤产生的多行数据 findInfoRowSet info

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

2024-06-25 00:51| 来源: 网络整理| 查看: 265

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

文章目录 前言一、仅处理一行是简单的二、多行数据的逐行处理

前言

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3