詳解kettle之User Defined Java Class步驟(一),kettledefined

來源:互聯網
上載者:User

詳解kettle之User Defined Java Class步驟(一),kettledefined


詳解User Defined Java Class步驟(一)

 

     kettle中的“user defined java class”步驟,也稱UDJC步驟,從4.0版本就有,功能非常強大,無所不能;可以在其中寫任意代碼,卻不影響效率。本文將詳細介紹在不同情境中用樣本展示如果使用該步驟,由於內容非常多,便於閱讀方便,把內容分成三部分,請完整看完全部內容,範例程式碼在這裡下載.

 

UDJC步驟工作機制

     使用者定義java類是從org.pentaho.di.trans.steps.userdefinedjavaclass.TransformClassBase繼承的;我們可以下載源碼,看看該類的方法與屬性,對我理解有協助。

     轉換運行時,UDJC步驟的代碼繼承TransformClassBase並編譯,該類是

一個通用步驟外掛程式類,有一些便利的公用方法。我們自訂的代碼可以根據實際情況覆蓋或繼承父類的方法或屬性,也可以聲明額外的方法或屬性,並且還可以在代碼的開始部分匯入類的聲明,預設以下類自動匯入:

import org.pentaho.di.trans.steps.userdefinedjavaclass.*;

importorg.pentaho.di.trans.step.*;

importorg.pentaho.di.core.row.*;

import org.pentaho.di.core.*;

importorg.pentaho.di.core.exception.*;

如果你已經比較熟悉kettle的內部機制,並想通過代碼方便地訪問一些對象,點擊udjc步驟屬性左側的程式碼片段,可以協助我們更快的學習。

下面的章節展示udjc步驟在不同情境中如果使用:

 

簡單的欄位轉換

     第一個樣本實現非常簡單的操作:把一個字串類型的欄位轉成大寫。目的是說明如何設定步驟並處理行,以及如何訪問輸入和輸出欄位。如果你已經在開發kettle外掛程式,這些對你來說就非常熟悉。假設行資料流中包含一個欄位“testfield”,udjc中定義一個字元類型的輸出欄位“uppercase”。下面的代碼實現把testfield轉成大寫並寫到輸出欄位作為結果。

代碼如下:

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

   Object[] r = getRow();

 

   if (r == null) {

       setOutputDone();

       return false;

   }

 

   if (first){

       first = false;

   }

 

   r= createOutputRow(r, data.outputRowMeta.size());

   

   // Get the value from an input field

   String test_value = get(Fields.In, "testfield").getString(r);

   

   // play around with it

   String uppercase_value = test_value.toUpperCase();

   

   // Set a value in a new output field

   get(Fields.Out, "uppercase").setValue(r, uppercase_value);

 

   // Send the row on to the next step.

   putRow(data.outputRowMeta, r);

 

   return true;

}

kettleudjc步驟調用processRow()方法去處理一個輸入行,如果返回true,繼續準備處理另一個輸入行,如果沒有資料處理,則返回false。

 

     getRow()是阻塞調用的;它等待前一步驟提供一行資料,如有必要返回一個對象數組表示輸入行,或null表明沒再輸入行需要處理。

 

     接下來是簡單的看似沒有用的三行代碼,涉及一個布爾類型的欄位first(父類的欄位),通過它可以方便的標識是否正在處理第一行資料,當有些工作僅僅需要執行一次,這比較有用。如果不使用,就可以忽略。

 

     調用createOutputRow()確保行數組足夠大,能夠容納增加的輸出欄位。

     get()方法可以基於名稱訪問步驟的輸入或輸出欄位,需要指明欄位的類型(In、Out、Info)和欄位的名稱,返回org.pentaho.di.trans.steps.userdefinedjavaclass.FieldHelper類的執行個體,該對象可以訪問欄位的資料。在父類的定義如下:public FieldHelper get(Fields type, String name) throwsKettleStepException;

 

     輸出欄位在行設定後,調用putRow()傳輸改行到可能的下一步驟。

     這個簡短的樣本通過快速定製計算輸入欄位的相關內容,樣本的轉換是附件中的uppercase.ktr檔案。

 

範例程式碼在這裡下載,更多內容請看第二部分及第三部分。


問kettle怎使用User Defined Java Class這個控制項

String firstnameField;
String lastnameField;
String nameField;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// 擷取輸入
//
Object[] r = getRow();
// 輸入為空白,直接false
//
if (r == null) {
setOutputDone();
return false;
}
// 處於效能考慮,parameter只查一次
//
if (first) {
firstnameField = getParameter("FIRSTNAME_FIELD");
lastnameField = getParameter("LASTNAME_FIELD");
nameField = getParameter("NAME_FIELD");
first=false;
}
// 用 createOutputRow() 來保證output的數組夠大,能夠裝下任何新的域
//
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
String firstname = get(Fields.In, firstnameField).getString(r);
String lastname = get(Fields.In, lastnameField).getString(r);
// Set the value in the output field
//
String name = firstname+" "+lastname;
get(Fields.Out, nameField).setValue(outputRow, name);
// putRow will send the row on to the default output hop.
//
putRow(data.outputRowMeta, outputRow);
return true;
}
 
kettle java class怎把結果輸出到控制台

不是javaw運行,然後使用System.out.print 就可以輸出
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.