kettle 外掛開發以及常用的介面和物件
阿新 • • 發佈:2018-11-11
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物件即可。