zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JS 面向对象
    堆 栈
    考试题
    HTML Meta标签
    Nodejs 安装
    CSS3 背景图片的大小位置
    JS Math函数
    CSS3 巧用before after选择器
    计算机网络原理_数据链路层
    Asp.net_验证控件
  • 原文地址:https://www.cnblogs.com/wxjnew/p/4329403.html
Copyright © 2011-2022 走看看