Как обращаться с денормализованными данными с чайником? - PullRequest
2 голосов
/ 24 октября 2011

Чайник имеет шаги "нормализатор строк" и "денормализатор строк", например

http://wiki.pentaho.com/display/EAI/Row+Normalizer

но они требуют, чтобы вы вручную настраивали поля в денормализованной таблице. Я не понимаю, как это можно использовать практически, так как количество полей в денормализованной таблице зависит от количества строк в нормализованной таблице, которая является динамической. Например. в их примере в денормализованной входной таблице есть три столбца для трех продуктов, и пользователь должен вручную указать преобразованию, как обрабатывать каждый из них. Но в реальном приложении количество продуктов будет меняться динамически. Таким образом, это преобразование будет работать только с одной таблицей в один момент времени. Все с другим количеством столбцов завершится ошибкой.

У меня есть десятки или сотни денормализованных входных файлов, которые очень похожи на их пример, все с различным количеством столбцов.

1 Ответ

0 голосов
/ 16 ноября 2011

У меня была похожая проблема с денормализацией. У меня был файл /etc/group со структурой, подобной group:gid:member1,member2,...., и я денормализовал его с помощью компонента User Defined Java Class, поэтому, наконец, у меня есть поля group,gid,member. Я знаю, что вам нужно другое направление, но это может быть хорошей отправной точкой для вас. Вот источник:

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
    // boilerplate
    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }
    if(first)
        first = 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 = RowDataUtil.allocateRowData(data.outputRowMeta.size());
        for (int j=0; j<r.length; ++j)
            out_row[j] = r[j];
        String account = accounts[i];
        get(Fields.Out, "account").setValue(out_row,account);
        putRow(data.outputRowMeta, out_row);
    }

    return true;
}
...