Kettle中根据一个输入行派生出多个输出行

浏览: 2522

依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用ETL工具kettle做数据校验的时候遇到的一些问题,一级解决方案.

1:数据校验效果图下图:

原始表数据(需要校验的表数据)

对上表数据进行校验,校验规则,order_nane、order_type不为空,order_money2>order_money2视为有效 

校验结果如下图所示:

在展现工具BIEE中具有会写功能,根据上面检查结果,可以把正确结果会写到数据库

2:kettle中的处理

1:日志表结果如1中的图示

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

3:结构图

  4:校验完成的js代码

  

1234567891011121314151617181920212223242526272829303132333435363738394041424344var 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

代码解析,校验结果的输出其实是在原始表的后面新增加的校验列中,这个赋值只是在处理过程的内存中,真实的原始表校验字段始终都是空的,只是在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

推荐 0
本文由 kingwang 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册