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

原文地址:https://www.cnblogs.com/wxjnew/p/4329403.html