依然在北京,早上停電了,整個人感覺對不好了,接下來就說一下在使用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