我要求执行以下操作。 提供的输入如下所示
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;
}
答案 0 :(得分:1)
您不需要UDJC。如果使用表输入步骤,则使用“排序行”步骤或“SQL中的ORDER BY子句”对“输入”设置的输入进行排序。使用“分组依据”步骤并为“组”字段设置“状态”,然后在聚合的“主题”字段中指定“城市”,并使用Concatenate strings separated by ,
作为聚合类型。