ETL工具kettle之循環job

        kettle的功能此處就不做過多的介紹了,此處主要是記錄一下自己第一次使用kettle工具遷移數據的經歷.需求:將兩個mysql數據庫(DB1,DB2)中的數據拷貝到一箇中間庫(DB3)中,然後在中間庫總進行多張表關聯查詢出最終的結果並輸出到另一張表中.所有數據是以店鋪號(shop)和商品編碼(productSaleId)作爲唯一索引.每次需要處理N個店鋪的商品.

實現:
編寫三個轉換(Transformation):
第一個Transformation1根據店鋪號(shop)將DB1中的商品數據拷貝到DB3表table1;
第二個Transformation2根據店鋪號(shop)將DB2的商品數據拷貝到DB3表table2;
第三個Transformation3根據店鋪號(shop)將table1和table2和其它表tablen關聯查詢將結果輸出到result中;
 

編寫一個JOB來將這3個Transformation串起來執行.
順序爲:Transformation1 -> Transformation2 -> Transformation3

此job每次只能處理一個shop的數據,現在有N個店鋪需要處理;現在需要只提交一次job處理N個店鋪的商品;

改造:將三個轉換Transformation中sql的查詢條件店鋪號用變量'${shop}'代替,店鋪號通過設置變量來達到
每次循環處理不同的店鋪;

轉換中查詢數據SQL格式如下,這個SQL並不是真正的SQL,只是一個簡單的示例,店鋪號使用'${shop}'代替.
切記將選項框:"替換SQL語句中的變量"勾上.這樣變量纔會生效.
SELECT
  id
, shop
, productsaleid
, name
FROM table where shop = '${shop}'
查詢出的數據可以直接使用"表輸出"輸出到指定表中.
循環job的編寫此處先上圖:

圖1:

圖2:

圖3:

JavaScript文本:

//讀取設置的店鋪列表,店鋪號用英文逗號分隔
var shopList = new String(parent_job.getVariable("shop_list"));

if(shopList.length > 0){

	var lastIndex = shopList.lastIndexOf(",");
	//截取shopList最後一個店鋪號
	var shop = shopList.substr(lastIndex+1,shopList.length);
	//設置店鋪號變量shop
	parent_job.setVariable("shop",shop);
	//切割掉最後一個店鋪號
	shopList = shopList.substr(0,lastIndex);
	//重新設置修改後的店鋪號列表
	parent_job.setVariable("shop_list",shopList);

	true;

}else{

	false;
}

圖4:

按照以上圖的序號編寫job就可以達到循環處理,重點還是爲了記錄JavaScript腳本.

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章