1. 程式人生 > >kettle 外掛開發以及常用的介面和物件

kettle 外掛開發以及常用的介面和物件

1. kettle外掛開發的四個常用的介面介紹


1.1 轉換步驟外掛開發至少需要實現 四個介面:

    1)StepMetaInterface:該介面主要是針對元資料的處理,載入xml檔案,校驗,主要針對一個步驟的定義基本 
       資料.在轉換開始之前,kettle會呼叫init()方法。轉換執行將僅在所有步驟從init()呼叫成功後才開 
       始。在步驟完成呼叫dispose()時,該步驟用於關閉資源,如檔案控制代碼(用來定位開啟的檔案在記憶體中的 
       位置, 檔案控制代碼定位到的是檔案物件,而非檔案。而檔案物件是對這個檔案的一些狀態、屬性的封裝,例 
       如讀取到的檔案位置等)、快取記憶體等。在實際處理時,kettle將會呼叫run方法(RunThread類中), 
       而run經常呼叫的是proccessRow(),直到沒有什麼要處理,或者轉換已經停止。呼叫proccessRow()用 
       來處理單行的資料。這個方法會呼叫getRow()呼叫來獲取一行進行處理。隨後proccessRow()將會執行 
       轉換工作,並呼叫putRow()。
    2)StepDataInterface:資料處理涉及具體資料以及資料的狀態的設定和回收。
    3)StepInterface:負責資料處理,轉換和流轉。這裡主要由proccessRow()方法來處理。
    4)StepDialogInterface:提供GUI/dialog,編輯步驟的元資料。

2. kettle中相關類的命名規則

1)StepInterface的實現類以外掛的功能相關命名:*.java
2)StepDataInterface的實現類:*Data.java
3)StepMetaInterface的實現類:*Meta.java
4)StepDialogInterface的實現類:*Dialog.java


3. 轉換執行過程


  3.1 簡單程式碼

     這段程式碼是根據已經生成的ktr檔案進行操作的

KettleEnvironment.init();
TransMeta transMeta = new TransMeta("etl/capturing_rows.ktr");
Trans trans = new Trans(transMeta);
trans.prepareExecution(null);
trans.startThreads();//執行該方法的時候,將會呼叫proccessRow()方法對每一行進行操作    
trans.waitUntilFinished();

  3.2 新增行監聽器 


    獲取轉換的所有步驟:

String[] stepNames = TransMeta.getStepNames();//獲取轉換的所有的步驟的名稱
StepInterface stepInterface = trans.getStepInterface(stepName,copy);//獲取執行步驟

    新增對應步驟的監聽器

stepInterface.addListener(new RowAdapter(){
@Override
public void rowReadEvent(RowMetaInterface rowMeta, Object[] row) throws KettleStepException {
//具體的讀取的過程
}

public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row) throws KettleStepException {
//具體寫的具體過程
}
});

    新增監聽器之後的執行順序: 
      在proccessRow()方法中,將會先呼叫getRow()方法,在getRow()方法中如果沒有讀取到資料,將會返回null,也不會執行對應的監聽器。如果有資料,將會執行竊聽器中的rowReadEvent方法。之後在呼叫putRow()方法時,將會執行rowWrittenEvent()方法。

  3.3 轉換監聽器 


    程式碼如下所示:

```
    trans.addTransListener(new TransListener() {
                @Override
                public void transStarted(Trans trans) throws KettleException {
                //轉換開始的事件
                }
                @Override
                public void transActive(Trans trans) {
                //轉換進行的操作
                }
                @Override
                public void transFinished(Trans trans) throws KettleException { 
                //轉換結束的操作
                }
            });

4. kettle 其他物件說明


    4.1 Row物件是kettle用來表示一行資料的標準物件,跟jdbc取出來的一條資料轉化後成為的一個POJO是一樣的。裡面可以包含多個欄位。 
    4.1 MemoryMetaData物件是pentaho特有的,是專門用來返回ETL任務執行後的結果的,與標準的JDBC裡面的resultSet 對應的resultSetMetaData 是一樣的。 
    4.3 對於如何處理資料的一個Listener,實現的是一個RowListener,資料是每一行每一行處理的,後面會介紹如果需要輸出資料怎麼取得這些輸出資料。如果不需要放回任何物件,則從1處開始都可以不要,只要初始化step物件即可。