依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用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”,不会被放入输出流中。
通过这个脚本一行数据可以变成四行数据。