先上例子:
这个demo中,Java代码步骤需要重点讲解.
这其实就是一个用户自定义的类,比自己写一个插件方便多了.
这个类的默认类名叫Processor,默认会导入一些包中的类:
import org.pentaho.di.trans.steps.userdefinedjavaclass.*;
import org.pentaho.di.trans.step.*;
import org.pentaho.di.core.row.*;
import org.pentaho.di.core.*;
import org.pentaho.di.core.exception.*;
//它继承了抽象类:
//org.pentaho.di.trans.steps.userdefinedjavaclass.TransformClassBasepublic class Processor extends TransformClassBase{
//处理一个输入行,如果返回true,继续准备处理另一个输入行,如果没有数据处理,则返回false。
public boolean proce***ow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// First, get a row from the default input hop
//它等待前一步骤提供一行数据,会阻塞,返回一个对象数组表示输入行
Object[] r = getRow();
// If the row object is null, we are done processing.
//输入行为null,说明已经没有输入行了,需要处理
if (r == null) {
setOutputDone();
return false;
}
// Let's look up parameters only once for performance reason.
//标识是否是第一行数据
if (first) {
first=false;
}
// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
// enough to handle any new fields you are creating in this step.
//确认object数组是否能够容纳输出行,如果不够,怎扩容.
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
//TransformClassBase抽象类的get( Fields type, String name ),返回FieldHelper
//org.pentaho.di.trans.steps.userdefinedjavaclass.FieldHelper
String name = get(Fields.In, "name").getString(r);
Number age = get(Fields.In, "age").getNumber(r);
String outValue=name+age;
get(Fields.Out, "out").setValue(outputRow, outValue);
// putRow will send the row on to the default output hop.
//将输出数据传输到下一步,会阻塞
putRow(data.outputRowMeta, outputRow);
return true;
}
}
注意点:
1.get(Fields.In, "name") 这个"name"从前一个步骤获取,也可以在这个步骤下方的参数中设置,标签设置为任意名称,如:xx,值就填上name,这样就可以将代码改为get(Fields.In,xx);
2.get(Fields.Out, "out") 这个"out"就是下方的字段中设置的out.
3.其实输入输出字段名都可以在下方的参数设置.用getParameter("name")获取到name的值.