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