2011-10-23 36 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; 
}