2

Kettle 具有“行规范化器”和“行非规范化器”步骤,例如

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

但它们要求您手动配置非规范化表中的字段。我不明白如何实际使用它,因为非规范化表中的字段数取决于规范化表中的行数,这是动态的。例如,在他们的示例中,非规范化输入表中的三个产品有三列,用户必须手动告诉转换如何处理每一个。但在实际应用中,产品的数量会动态变化。因此,此转换仅适用于一个表,在某一时刻。任何具有不同列数的东西都会失败。

我有几十个或几百个看起来非常像他们的示例的非规范化输入文件,它们都有不同的列数。

4

1 回答 1

0

我在非规范化方面遇到了类似的问题。我有/etc/group一个结构类似于 的文件group:gid:member1,member2,....,我用一个组件对其进行了非规范化User Defined Java Class,所以最后我有了 fields 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;
}
于 2011-11-16T15:35:00.597 回答