Чайник: несколько putRows () в processRow () правильно? - PullRequest
2 голосов
/ 10 октября 2011

Я обрабатываю файл /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().Google не помог.

Kettle transformation illustration

Загадочно, если я создаю преобразование, как показано на рисунке, тогда

  • XLS debug A имеет правильные значения account в каждомстрока
  • XLS debug B имеет повторяющиеся значения account, как в примере с примером.

Если поместить шаг Dummy перед Select values 7, XLS debug B станет правильным иXLS debug A становится плохо.

1 Ответ

3 голосов
/ 10 октября 2011

Проблема связана со следующей строкой (первая строка в цикле 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];

UPDATE: более простой способ, который по сути тот же:

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