首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用kettle处理非规范化数据?

如何使用kettle处理非规范化数据?
EN

Stack Overflow用户
提问于 2011-10-24 04:39:33
回答 1查看 1.6K关注 0票数 2

水壶有“行规格化”和“行反规格化”两个步骤。

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

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

我有几十甚至几百个非规范化的输入文件,它们看起来与它们的示例非常相似,都有不同的列数。

EN

回答 1

Stack Overflow用户

发布于 2011-11-16 23:35:01

我在反正规化方面也遇到了类似的问题。我有一个结构类似于group:gid:member1,member2,..../etc/group文件,我用一个User Defined Java Class组件对它进行了反规范化,所以最后我得到了字段group,gid,member。我知道你需要另一个方向,但这对你来说可能是一个很好的起点。以下是源代码:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7869020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档