2011-10-23 34 views
2

水壶具有“行归一化器”和“行去归一化器”步骤,例如,如何处理非规范化的数据与水壶?

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

,但他们需要您手动配置领域中的非规范化表。我不明白如何实际使用它,因为非规格化表中的字段数取决于规格化表中的行数,这是动态的。例如。在他们的例子中,非规格化输入表中有三个产品列,用户必须手动告诉变换如何处理每个产品。但在实际应用中,产品数量会动态变化。因此,这种转换只能在一个时间段内与一张桌子一起工作。具有不同列数的任何东西都会失败。

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

回答

0

我有一个非规范化的类似问题。我有一个/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; 
}