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
Kettle中根据一个输入行派生出多个输出行的更多相关文章
- Linux中的一个命令行计算器bc简介
假如你在一个图形桌面环境中需要一个计算器时,你可能只需要一路进行点击便可以找到一个计算器.例如,Fedora 工作站中就已经包含了一个名为 Calculator 的工具.它有着几种不同的操作模式,例如 ...
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- MVC中的Controller中返回一个JsonResult在弹出一个下载框?
public JsonResult ReturnTest() { return Json(new {myMsg ="hello world"}, "text/html; ...
- kettle中全局变量的设置
设置全局变量. 找到.properties文件: 在文件中设置值: 在kettle中新建一个job(不用做任何设置): 转换中获取便元的设置: 重启kettle的执行结果:
- Kettle中txt类型数据源作为输入需要注意的地方
文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...
- kettle中使用JavaScript的一个例子
最近在使用kettle的时候遇到一个问题,需要对输入的一个字段进行格式化,逻辑比较复杂(需要做替换掉指定的字符串,然后将数字部分不足四位的数前边补0等操作),kettle中没有提供直接的插件来支持复杂 ...
- Jquery操作表格多出一个内容行
目录 前言 需求 如何监听每一行点击,获取点击id 前后端 问题更新,ajax异步带来的问题 废弃使用HTML拼接 前言 我的前端实在是太差劲了,导致Jquery操作表格多出一个内容行,这个功能我都做 ...
- 【C语言】请输入一个n(n<=10)并输出一个n行n列的杨辉三角
应用二维数组的知识 杨辉三角特点: 1.第一列和对角线的元素全部为1 2.其他元素等于上一行的当前列的值和上一行中当前列前边一列的值之和 #include<stdio.h> #define ...
- js之常见问题--for循环中为什么点击总是弹出最后一个i
首先看看点击不同li标签时,弹出li的索引值对应的结果 HTML: <ul> <li>0</li> <li>2</li> <li> ...
随机推荐
- CodeForces 785C Anton and Fairy Tale
二分. 如果$n≤m$,显然只能$n$天. 如果$n>m$,至少可以$m$天,剩余还可以支撑多少天,可以二分计算得到,也可以推公式.二分计算的话可能爆$long$ $long$,上了个$Java ...
- EOJ 3247 铁路修复计划
二分,最小生成树. 二分一下$k$,然后每次算最小生成树验证即可,事实证明,$cmp$函数,参数用引用还是能提高效率的,不引用一直$TLE$,时限有点卡常. 然后错误的代码好像$AC$了啊,$L$和$ ...
- java -jar demo.jar
部署springboot项目 生成jar包其实还是依赖springboot的jar才能跑起来,为什么呢? 1.在C盘手工创建了一个文件夹,是拷贝了demo.jar这个jar包运行是报错的. 2.在D: ...
- NEO4j简单入门
Neo4j是: 一个开源 无Schema 没有SQL 图形数据库 图形数据库也称为图形数据库管理系统或GDBMS. Neo4j的官方网站:http://www.neo4j.org Neo4j的优点 它 ...
- canconfig 移植记录
can 在Linux 里面是作为一个网络设备存在的,记录一下 canconfig 移植过程. 一. 下载 canutils 和 libsocketcan libsocketcan 地址: http:/ ...
- 缩略图信息提取工具vinetto
缩略图信息提取工具vinetto 在Windows操作系统中,为了方便用户快速浏览图片,系统会自动为每个图片生成预览图.预览图默认保存在同目录的Thumbs.db文件中.当图片文件删除后,Thum ...
- Selenium之PhantomJS相关设置
设置PhantomJS请求头 默认情况下: from selenium import webdriver import time driver = webdriver.PhantomJS() driv ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- NTFS ADS带来的web安全问题
有关ADS的简单说明请看http://www.xfocus.net/articles/200212/466.html 可以看到ADS在很久以前就被一些安全人员所关注,并且也提出了一些经典的利用,比如隐 ...
- [HAOI2012]外星人
题目大意: 告诉你一个数n,求满足φ^x(n)=1的x. 思路: 首先我们可以发现满足φ(n)=1的数只有2,也就是说你得到最终的结果,最后一步肯定是φ(2). 同时,可以发现φ(φ(2^k))=φ( ...