依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用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内存管理中的slab分配器

    转载自:http://edsionte.com/techblog/archives/4019 Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的. ...

  2. viewpager切换耗时控制

    原文地址https://my.oschina.net/javalover/blog/179003 public class FixedSpeedScroller extends Scroller { ...

  3. maven的认识

    >>>>>>>>>> 安装完成后,设置为环境变量 命令行输入,如下图片就表明成功 >>>>>>>& ...

  4. 洛谷P2571 [SCOI2010]传送带 [三分]

    题目传送门 传送带 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移 ...

  5. 【数学】At Coder 091 D题

    [深夜题解] 题目链接:https://arc091.contest.atcoder.jp/tasks/arc091_b 题目大意:给出两个正整数N.K,找出所有的不大于N的正整数对(a,b)使b%a ...

  6. AM335x开发板与PC机虚拟机建立tftp文件传输

    1.AM335x开发板必须要支持以太网,而且在U-boot中要有完好的以太网驱动 因为开发板的储存介质为SD卡,所以在编译好的U-boot中并没有配置网络环境,为了不使每次上电都修改u-boot的网络 ...

  7. Google图片和NASA 网站图片的爬虫

    1.根据关键字爬取NASA网站上的图片 首先针对需要爬取的网站进行分析,输入关键字查找需要的内容 通过关键字请求,网页每次会加载20张的缩略图,分析网页源码能够很容易的找到缩略图的url: 然后再点开 ...

  8. HDU 5673 Robot 数学

    Robot 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 Description There is a robot on the origi ...

  9. uva 6952 Cent Savings dp

    Cent Savings Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/vie ...

  10. Map中keySet和entrySet的区别

    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet():将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代方式取出所有的键, ...