gpt4 book ai didi

java - 水壶:processRow() 中的多个 putRows() 正确吗?

转载 作者:行者123 更新时间:2023-12-04 06:11:38 26 4
gpt4 key购买 nike

我正在处理一个 /etc/group来自系统的文件。我加载 CSV input使用分隔符步进 : .它有四个字段:group , pwfield , gid , members . members字段是一个逗号分隔的列表,其中包含从 0 到无限的未指定计数的帐户名称。

我想生成一个包含三个字段的记录列表:group , gid , account .在第一步中,我使用 User Defined Java Class ,在第二个我使用 Select values .

示例输入:

root:x:0:
first:x:100:joe,jane,zorro
second:x:101:steve

示例输出 (XLS) - 预期:
group   gid account
first 100 joe
first 100 jane
first 100 zorro
second 101 steve

示例输出 (XLS) - 实际,错误:
group   gid account
first 100 zorro
first 100 zorro
first 100 zorro
second 101 steve

用户定义的 Java 类:
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// boilerplate
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
String tmp = get(Fields.In, "members").getString(r);
if(null==tmp)
return true;
String accounts[] = tmp.split(",");
for(int i=0; i<accounts.length; ++i){
Object[] out_row = createOutputRow(r, data.outputRowMeta.size());
String account = accounts[i];
get(Fields.Out, "account").setValue(out_row,account);
putRow(data.outputRowMeta, out_row);
}

return true;
}

我相信我错过了调用一些管理功能,或者我应该使用除 createOutRow() 以外的其他东西。 .谷歌没有帮助。

Kettle transformation illustration

如果我创建一个如图所示的转换那么神秘
  • XLS debug A有正确 account每行中的值
  • XLS debug B有重复 account值如示例输出。

  • 如果我放置一个 Dummy前一步 Select values 7 , XLS debug B变得正确和 XLS debug A变坏。

    最佳答案

    问题出在以下行(for 循环中的第一行):

    Object[] out_row = createOutputRow(r, data.outputRowMeta.size());

    它应该替换为以下三行:
    Object[] out_row = RowDataUtil.allocateRowData(data.outputRowMeta.size());
    for (int j=0; j<r.length; ++j)
    out_row[j] = r[j];

    更新 :一种更简单的方法,本质上是相同的:
    Object[] out_row = RowDataUtil.createResizedCopy(r, data.outputRowMeta.size());

    关于java - 水壶:processRow() 中的多个 putRows() 正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713838/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com