2011-10-23 2 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; 
} 
관련 문제