kettle中調用java類
有時須要在kettle調用java類,如:驗證、查詢或自己定義加密等。有時甚至連主要的數據訪問都不那么簡單,如獲取一個存儲文件或使用一個數據庫連接,某些數據源可能封裝在應用程序中,手工使用自己定義的javaclient訪問是唯一的方法。
本文介紹怎樣在kettle中調用java類。演示樣例代碼在這里下載。
注:假設你使用kettle4.0及以上版本號。也你也能夠使用user defined java class 步驟實現。
Modified Java ScriptValue 步驟
關鍵要在kettle中使用ModifiedJava Script Value 步驟。從名稱上看是只運行javascript來實現該步驟,事實上也能夠運行java代碼。為了理解。我們須要知道該步驟使用Rhino javaScript 引擎來實現。使其能夠在jvm中實現javascript,也使其成為可能,讓腳本去訪問java類。為了說明其怎樣實現。讓我們來看一個簡單的轉換演示樣例,使用java去計算某個字段的md5碼。例如以下圖所看到的:
javascript步驟實現md5計算,包括例如以下代碼:
// simulate java imports
varMessageDigest =java.security.MessageDigest;
varString =java.lang.String;
varStringBuffer =java.lang.StringBuffer;
varInteger =java.lang.Integer;
// get the md5 digest algorithm
varalgorithm =MessageDigest.getInstance("MD5");
// get the input as bytes
varbytes = newString(test_value).getBytes("UTF-8");
// calculate the digest
algorithm.reset();
algorithm.update(bytes);
varmd5Digest =algorithm.digest();
// turn the digest into a hex-stringrepresentation
varhexString = newStringBuffer();
for(vari =0; i < md5Digest.length; i++){
varhex= Integer.toHexString(0xFF & md5Digest[i]);
if(hex.length()== 1){
hexString.append('0');
}
hexString.append(hex);
}
// write output value
varmd5_hash =hexString.toString().toUpperCase();
讓我們詳解以上代碼。
第一部分是就如java 導入包環節,其實和java中import實現相同目的。聲明變量指向java類。是為了避免我們后面引用每一個java類使用完整java長類名帶來不便。當使用自定義的類是,要注意不小心覆蓋了javascript類。javascript也有其自己的Date類實例,稍不在意,使用這樣的方式非常easy覆蓋。
接着是調用簡單的java API生成md5值,須要指出的是,輸入字段作為javascript對象。“test_value”字段是javascript String對象。有多種方法將其轉換成java String對象,這里使用簡單的構造函數實現。java String的getBytes()方法返回字節數組。
md5摘要值計算好后。接着通過一小段循環代碼生成表現該值的字符串,最后作為一個新字段寫到輸出行。
使用外部jar包中的類
運行太多的腳步可能影響性能,所以總是把復雜的業務讓編譯好的java代碼來做。一般是一些整潔的實現我們業務的java類庫,有時我們可能自己去創建。kettle現有的功能當然不能滿足我們的全部需求,調用幾個外部類庫能夠避免寫一個完整kettle插件。kettle啟動時載入libext文件夾及子文件夾下全部jar文件。假設你須要訪問自己定義jar包的類,須要放在libext文件里。我們演示樣例是關於MD5,從kettle3.2已經有了對應的jar包(apache commons codec項目)。
codec項目有非常好的方法計算輸入字符串的MD5十六進制字符串,正好是我們須要的;我們只使用DigestUtil類的方法就可以。
//get a nice md5 hash
varmd5_hash = org.apache.commons.codec.digest.DigestUtils.md5Hex(test_value);
在我筆記本上執行新轉換大概10500行/秒,第一版本號的只大概2900行/秒.
兩者的處理速度區別非常大,所以用封裝好的功能似乎真的飛快。當然有可能apache項目採用全然不同的MD5算法實現。
不管如何,后者的實現既簡單又快。
結論
Modified Java Script Value 步驟同意訪問不論什么jvm中java類。假設你ETL項目有特定的需求,你已經使用java實現過的需求。這時你能夠考慮使用這樣的方法試試。
當使用腳步代碼總是須要監視性能問題。假設你使用了大量的外部庫。就須要有正確的版本號依賴管理,否則在測試環境或部署環境中會產生問題。