使用PDI中的UDJC步骤处理多个输入行

时间:2013-06-28 13:48:53

标签: pentaho

我要求执行以下操作。 提供的输入如下所示

State city
NY    joe 
NY    jane 
LA    zorro 
LA    steve

,输出应为

State city
NY    joe, jane
LA    steve, zorro

如何实现这一目标?我想我必须处理多个输入行但是当我第二次使用getRow()方法尝试读取新行时,它会抛出数组越界异常....请帮我解决这个问题。 TIA

这是我尝试过的逻辑......

String cities;
Object[][] r = new Object[10][];
static int j;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{

for(;j<10||(r[j]=getRow())!=null;j++)
{
return true;
}

cities=get(Fields.In, "CITY").getString(r[0]);

int i;
for(i=1;r[i]!=null;i++)
{
if(get(Fields.In, "STATE").getString(r[i-1])==get(Fields.In, "STATE").getString(r[i])){

cities=cities+","+get(Fields.In, "CITY").getString(r[i]);
}
else{
Object[] outputRow = createOutputRow(new Object[4],1);
get(Fields.Out, "STATE").setValue(outputRow, get(Fields.In, "STATE").getString(r[i-1]));
get(Fields.Out, "CITIES").setValue(outputRow, cities);
putRow(data.outputRowMeta, outputRow);
cities=get(Fields.In, "CITY").getString(r[i]);
}
}
Object[] outputRow = createOutputRow(new Object[4],1);
get(Fields.Out, "STATE").setValue(outputRow, get(Fields.In, "STATE").getString(r[i-1]));
get(Fields.Out, "CITIES").setValue(outputRow, cities);
putRow(data.outputRowMeta, outputRow);

return false;
}

1 个答案:

答案 0 :(得分:1)

您不需要UDJC。如果使用表输入步骤,则使用“排序行”步骤或“SQL中的ORDER BY子句”对“输入”设置的输入进行排序。使用“分组依据”步骤并为“组”字段设置“状态”,然后在聚合的“主题”字段中指定“城市”,并使用Concatenate strings separated by ,作为聚合类型。