依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用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

Kettle中根据一个输入行派生出多个输出行的更多相关文章

  1. Linux中的一个命令行计算器bc简介

    假如你在一个图形桌面环境中需要一个计算器时,你可能只需要一路进行点击便可以找到一个计算器.例如,Fedora 工作站中就已经包含了一个名为 Calculator 的工具.它有着几种不同的操作模式,例如 ...

  2. C++primer原书中的一个错误(派生类using声明对基类权限的影响)

    在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...

  3. MVC中的Controller中返回一个JsonResult在弹出一个下载框?

    public JsonResult ReturnTest() { return Json(new {myMsg ="hello world"}, "text/html; ...

  4. kettle中全局变量的设置

    设置全局变量. 找到.properties文件: 在文件中设置值: 在kettle中新建一个job(不用做任何设置): 转换中获取便元的设置: 重启kettle的执行结果:

  5. Kettle中txt类型数据源作为输入需要注意的地方

    文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...

  6. kettle中使用JavaScript的一个例子

    最近在使用kettle的时候遇到一个问题,需要对输入的一个字段进行格式化,逻辑比较复杂(需要做替换掉指定的字符串,然后将数字部分不足四位的数前边补0等操作),kettle中没有提供直接的插件来支持复杂 ...

  7. Jquery操作表格多出一个内容行

    目录 前言 需求 如何监听每一行点击,获取点击id 前后端 问题更新,ajax异步带来的问题 废弃使用HTML拼接 前言 我的前端实在是太差劲了,导致Jquery操作表格多出一个内容行,这个功能我都做 ...

  8. 【C语言】请输入一个n(n<=10)并输出一个n行n列的杨辉三角

    应用二维数组的知识 杨辉三角特点: 1.第一列和对角线的元素全部为1 2.其他元素等于上一行的当前列的值和上一行中当前列前边一列的值之和 #include<stdio.h> #define ...

  9. js之常见问题--for循环中为什么点击总是弹出最后一个i

    首先看看点击不同li标签时,弹出li的索引值对应的结果 HTML: <ul> <li>0</li> <li>2</li> <li> ...

随机推荐

  1. Linux的经典shell命令整理

    Linux的经典shell命令整理 1.删除0字节文件find -type f -size 0 -exec rm -rf {} \; 2.查看进程按内存从大到小排列ps -e -o “%C : %p ...

  2. PlayMaker布局技巧:预览GUI界面

    PlayMaker布局技巧:预览GUI界面   PlayMaker提供丰富的动作用来构建界面.对于复杂界面,每次通过调试方式查看效果,会非常麻烦.这个时候,开发者可以考虑使用PlayMaker GUI ...

  3. Vue 2.0学习(二)数据绑定

    Vue实例对象 创建一个vue应用很简单,通过构造函数Vue就能创建一个Vue的根实例: var app = new Vue({ el: '#app', data: { message: 'Hello ...

  4. 【HDU 6017】 Girls Love 233 (DP)

    Girls Love 233 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. 韩梦飞沙-屏幕录像专家 win10 含注册机

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 韩梦飞沙-屏幕录像专家 win10 含注册机 百度云盘下载地址:https://pan. ...

  6. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  7. python3-开发进阶Flask的基础(2)

    知识回顾 1.django 和flask区别? 最大的不同就是django请求相关的数据,通过参数一个一个传递过去的,而flask就是先把放在某个地方,然后去取,这个东西叫上下文管理 2.什么是wsg ...

  8. dcoker常用命令

    记录一下常用的命令 docker run -t -i  xxxx /bin/bash 运行容器的交互会话shell docker start xxxx 启动容器 docker stop xxxx 停止 ...

  9. jsp和servlet有哪些相同点和不同点,它们之间的联系是什么?

    1.jsp经编译后就变成了servlet(jsp本质就是servlet,jvm只能识别java的类,不能识别jsp代码,web容器将jsp的代码编译成jvm能够识别的java类) 2.jsp更擅长表现 ...

  10. WebSQL的基本使用过程

    1.创建或打开数据库(openDatabase) var db = openDatabase('dbname', '1.0', 'discription', 2 * 1024); // 目前测试只有C ...