Kettle中根據一個輸入行派生出多個輸出行


依然在北京,早上停電了,整個人感覺對不好了,接下來就說一下在使用ETL工具kettle做數據校驗的時候遇到的一些問題,一級解決方案.

1:數據校驗效果圖下圖:

原始表數據(需要校驗的表數據)

對上表數據進行校驗,校驗規則,order_nane、order_type不為空,order_money2>order_money2視為有效 

校驗結果如下圖所示:

在展現工具BIEE中具有會寫功能,根據上面檢查結果,可以把正確結果會寫到數據庫

2:kettle中的處理

1:日志表結果如1中的圖示

2:需要check的表需要加上日志表的字段,還有check_status字段

3:結構圖

  4:校驗完成的js代碼

  

var check_table="T_CHECK_TEST";//校驗有關的表名字,可能存在多個
var string_cloumn="";//校驗到的錯誤詳細情況
var check_type="";//校驗到的錯誤類型
var strConn = "bjitic_og";
//定義所有校驗枚舉值
var order_name_isnotnull=1;
var order_type_isnotnull=1;
//賦值所有校驗枚舉值
if(ORDER_NAME==null){order_name_isnotnull=0;}
if(ORDER_TYPE==null){order_type_isnotnull=0;}
//獲取所有為空的列名
if(order_name_isnotnull==0){string_cloumn="order_name";}
if(order_type_isnotnull==0){
if(string_cloumn=="")
  {
  string_cloumn="order_type";
  }
  else
  {
  string_cloumn=string_cloumn+","+"order_type";
  }
                            }
if(string_cloumn!="")
{
   var tokens = string_cloumn.split(",");
   for (var i =0; i<tokens.length; i++)
   {
   var row = createRowCopy(getOutputRowMeta().size());
   var index = getInputRowMeta().size();
   row[7]=check_table;
   row[8]=tokens[i];
   row[9]="違反了非空校驗";
   row[10]="order_id";
   row[11]=ORDER_ID;
   row[13]=CHECK_MAN;
   row[14]=INPUT_MAN;
   row[15]="no";
   //row[10]=check_date;
 
   putRow(row); 
   }
   trans_Status = SKIP_TRANSFORMATION; 
 
}

代碼解析,校驗結果的輸出其實是在原始表的后面新增加的校驗列中,這個賦值只是在處理過程的內存中,真實的原始表校驗字段始終都是空的,只是在create row 的時候作為一個對象來處理,check_table中的字段必須在原始表中提醒才可以生產多個行

row[7]=check_table;

row[8]=tokens[i];
row[9]="違反了非空校驗";
row[10]="order_id";
row[11]=ORDER_ID;
row[13]=CHECK_MAN;
row[14]=INPUT_MAN;
row[15]="no";

5:完整的流程

---------------------------------------------------------------以上想法來自下面的網摘--------------------------------------------------------------

var str = row[8].toString();
var tokens = str.split(" ");
var i;
for (i =0; i<tokens.length; i++)
{
var row = createRowCopy(getOutputRowMeta().size());
var index = getInputRowMeta().size();
row[index]=tokens[i];
putRow(row);
}
trans_Status = SKIP_TRANSFORMATION;

說明:
row[8].toString(); 數據行里第八列里的數據是以空格分隔的一個字符串。如 “aaa bbb ccc ddd”

str.split(" "); 把字符串按照空格分為一個字符數組,如上面的例子,就分隔為長度為 4 的數組。
for (i =0; i<tokens.length; i++) 循環tokens

{

createRowCopy(getOutputRowMeta().size()); 使用 createRowCopy 函數創建一個新行,長度是getOutputRowMeta().size()。

index = getInputRowMeta().size(); 根據輸入流獲得數據行里最后一列的位置。

row[index]=tokens[i]; 把每個 token, 放到每個新創建行的最后一列。
putRow(row); 把新創建的行放到輸出流中,下一個步驟就可以使用了。

}

trans_Status = SKIP_TRANSFORMATION; 這個是必要的,保證原始的數據行“aaa bbb ccc ddd”,不會被放入輸出流中。

通過這個腳本一行數據可以變成四行數據。

---------------------------------------------------------------以上想法來自下面的網摘--------------------------------------------------------------

感謝網絡資料出處:http://www.360doc.com/content/13/1101/17/13247663_325897851.shtml

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM