详解user defined java class步骤(二) kettle中的user defined java class步骤,也称udjc步骤,从4.0版本就有,功能非常强大,无所不能;可以在其中写任意代码,却不影响效率。本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于
详解user defined java class步骤(二)
kettle中的“user defined java class”步骤,也称udjc步骤,从4.0版本就有,功能非常强大,无所不能;可以在其中写任意代码,却不影响效率。本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载.
如果没有从第一部分开始,请访问第一部分。
使用步骤参数(step parameter)
如果你写了一段代码,如果想让带更通用,步骤参数这时就能用到;在示例中,我们提供一个正则表达式和一个字段的名称,该步骤检查参数对应的字段是否匹配正则表达式,如果是返回结果为1,反之为0。
代码如下:
import java.util.regex.pattern;
private pattern p = null;
private fieldhelper fieldtotest = null;
private fieldhelper outputfield = null;
public boolean processrow(stepmetainterfacesmi, stepdatainterface sdi) throws kettleexception
{
object[] r = getrow();
if (r == null) {
setoutputdone();
return false;
}
// prepare regex and field helpers
if (first){
first = false;
string regexstring = getparameter(regex);
p = pattern.compile(regexstring);
fieldtotest = get(fields.in, getparameter(test_field));
outputfield = get(fields.out, result);
}
r= createoutputrow(r, data.outputrowmeta.size());
// get the value from an input field
string test_value = fieldtotest.getstring(r);
// test for match and write result
if (p.matcher(test_value).matches()){
outputfield.setvalue(r, long.valueof(1));
}
else{
outputfield.setvalue(r, long.valueof(0));
}
// send the row on to the next step.
putrow(data.outputrowmeta, r);
return true;
}
getparameter()方法返回在ui界面中定义的参数对应值内容,当然参数的值也可能是kettle的变量。把变量作为参数是使用变量通常的做法。我们可以在步骤的xml代码中手工搜索到变量。
示例的转换名称是:parameter.ktr.
消息步骤(info steps)使用
有时需要合并多个输入步骤,可能赋予不同的角色,就如流查询步骤。消息步骤用来提供查询,其数据行不通过getrow()方法返回。在udjc步骤中非常容易使用。在udjc步骤的ui界面消息步骤选项卡中定义,通过getrowsfrom()方法返回对应的值。
示例转换中使用消息步骤接收一组正则表达式,用其测试主流数据中的一个字段是否匹配,如果任何一个表达式匹配,结果字段设置为1.如果没有任何匹配,则结果为0,同时附加输出匹配的表达式。
代码如下:
import java.util.regex.pattern;
import java.util.*;
private fieldhelper resultfield = null;
private fieldhelper matchfield = null;
private fieldhelper outputfield = null;
private fieldhelper inputfield = null;
private arraylist patterns = newarraylist(20);
private arraylist expressions = newarraylist(20);
public boolean processrow(stepmetainterfacesmi, stepdatainterface sdi) throws kettleexception
{
object[] r = getrow();
if (r == null) {
setoutputdone();
return false;
}
// prepare regex and field helpers
if (first){
first = false;
// get the input and output fields
resultfield = get(fields.out, result);
matchfield = get(fields.out, matched_by);
inputfield = get(fields.in, value);
// get all rows from the info stream andcompile the regex field to patterns
fieldhelper regexfield = get(fields.info, regex);
rowset infostream = findinforowset(expressions);
object[] inforow = null;
while((inforow = getrowfrom(infostream)) != null){
string regexstring = regexfield.getstring(inforow);
expressions.add(regexstring);
patterns.add(pattern.compile(regexstring));
}
}
// get the value of the field to check
string value = inputfield.getstring(r);
// check if any pattern matches
int matchfound = 0;
string matchexpression = null;
for(int i=0;iif (((pattern) patterns.get(i)).matcher(value).matches()){
matchfound = 1;
matchexpression = (string)expressions.get(i);
break;
}
}
// write result to stream
r= createoutputrow(r, data.outputrowmeta.size());
resultfield.setvalue(r, long.valueof(matchfound));
matchfield.setvalue(r, matchexpression);
// send the row on to the next step.
putrow(data.outputrowmeta, r);
return true;
}
调用findinforowset()方法,返回在udjc步骤的消息步骤中定义的名称对应的输入步骤的整个行集内容。从行集内容中读取某行与从主数据流中去某行不同,通过调用getrowfrom(),并显示指明那个行集。
示例转换的名称为info_steps.ktr.
使用目标步骤(target steps)
使用udjc步骤有时可能需要指定行集流转到不同的目标步骤。通过调用putrow()方法,并传递一个目标步骤作为参数。我们需要在udjc步骤的ui界面的目标步骤中定义所有可能的目标步骤,下面示例中随机分发行数据到不同弄的目标步骤。
findtargetrowset()方法返回在ui界面中定义的目标步骤行集,并作为putrowto()方法的参数.示例转换的名称为target_steps.ktr.
代码如下:
import java.util.regex.pattern;
import java.util.*;
private rowset lowprobstream = null;
private rowset highprobstream = null;
public boolean processrow(stepmetainterfacesmi, stepdatainterface sdi) throws kettleexception
{
object[]r = getrow();
if(r == null) {
setoutputdone();
returnfalse;
}
//prepare regex and field helpers
if (first){
first = false;
lowprobstream= findtargetrowset(low_probability);
highprobstream= findtargetrowset(high_probability);
}
//send the row on to the next step.
if(math.random()
putrowto(data.outputrowmeta, r,lowprobstream);
}
else{
putrowto(data.outputrowmeta, r,highprobstream);
}
returntrue;
}
更多内容请查看第三部分;
