利用kettle中的JS来完成ETL数据校验
最近参与了一个信托行业的BI项目,由于信托业务系统设计的问题,很多都是用户手工录入的数据,也有一些是需要分析的但是用户没有录入的数据,针对这样的数据质量,我们就要在ETL抽取的过程中来对数据流进行校验,今天我们就说一下如何利用ETL开源工具kettle来完成对数据的基础性校验
1:非空校验
if(INTRUST_FLAG1==null){intrust_flag1_isnull=;}
2:唯一校验
var uniquesql_item_id = "SELECT count(*) FROM titem where item_id="+ITEM_ID;
if(fireToDB(strConn,uniquesql_item_id)[[]==1){item_id_isunique=;}
3:标准化校验
var normalsql_intrust_type= "select count(*) from trust_tdictparam where type_id=1104 and type_value="+INTRUST_TYPE;
if(fireToDB(strConn, normalsql_intrust_type)[0][0]>0){intrust_type_isnormal=1;}
完整的JS处理逻辑展示如下
var check_status=0;//如果检测到有任何一种校验错误,则check_status=1
var check_table="T_ITEM_TITEM";//校验有关的表名字,可能存在多个
var source_table="titem";//数据源表名称,如果数据来自多个数据表,则需要声明多个
var source_table_id="item_id";//数据源表主键,如果多个表联合主键,则需要声明多个主键
var check_detail="";//校验到的错误详细情况
var check_name="";//主键名称
var check_type="";//校验到的错误类型
var check_date=new Date();//校验时间
var strConn = "bjitic_og"; //////////////////////////////////定义所有校验枚举值////////////////////
//1:唯一性枚举值
var item_id_isunique=0;
var item_code_isunique=0;
var item_name_isunique=0;
//2:非空枚举值
var intrust_flag1_isnull=0;
var intrust_type_isnull=0;
var intrust_type_subitem_isnull=0;
var intrust_type1_isnull=0;
var intrust_type2_isnull=0;
var item_num_isnull=0;
var item_money_isnull=0;
var exp_rate1_isnull=0;
var exp_rate2_isnull=0;
var intrust_flag3_isnull=0;
var intrust_flag4_isnull=0;
var entity_type_isnull=0;
var deal_type_isnull=0;
var managertype_isnull=0;
var natrust_type_isnull=0;
var custodian_bank_isnull=0;
var with_bank_flag_isnull=0;
var with_security_flag_isnull=0;
var with_private_flag_isnull=0;
var with_gov_flag_isnull=0;
var ben_period_isnull=0; //3:标准化枚举值
var intrust_type_isnormal=0;
var intrust_type_subitem_isnormal=0;
var intrust_type1_isnormal=0;
var intrust_type2_isnormal=0;
var entity_type_isnormal=0;
var deal_type_isnormal=0;
var natrust_type_isnormal=0;
var custodian_bank_isnormal=0;
var innovat_type_isnormal=0;
var bank_id_isnormal=0;
var gov_regional_isnormal=0;
//4:类型校验枚举值
var ben_period_isnumber=0;
////////////////////////////////唯一性校验枚举值赋值
var uniquesql_item_id = "SELECT count(1) FROM titem where item_id="+ITEM_ID;
var uniquesql_item_code = "SELECT count(1) FROM titem where item_code="+ITEM_CODE;
var uniquesql_item_name = "SELECT count(1) FROM titem where item_name="+"'"+ITEM_NAME+"'";
if(fireToDB(strConn,uniquesql_item_id)[0][0]==1){item_id_isunique=1;}
if(fireToDB(strConn,uniquesql_item_code)[0][0]==1){item_code_isunique=1;}
if(fireToDB(strConn,uniquesql_item_name)[0][0]==1){item_name_isunique=1;}
////////////////////////////////非空校验枚举值赋值
if(INTRUST_FLAG1==null){intrust_flag1_isnull=1;}
if(INTRUST_TYPE==null){intrust_type_isnull=1;}
if(INTRUST_TYPE_SUBITEM==null){intrust_type_subitem_isnull=1;}
if(INTRUST_TYPE1==null){intrust_type1_isnull=1;}
if(INTRUST_TYPE2==null){intrust_type2_isnull=1;}
if(ITEM_NUM==null){item_num_isnull=1;}
if(ITEM_MONEY==null){item_money_isnull=1;}
if(EXP_RATE1==null){exp_rate1_isnull=1;}
if(EXP_RATE2==null){exp_rate2_isnull=1;}
if(INTRUST_FLAG3==null){intrust_flag3_isnull=1;}
if(INTRUST_FLAG4==null){intrust_flag4_isnull=1;}
if(ENTITY_TYPE==null){entity_type_isnull=1;}
if(DEAL_TYPE==null){deal_type_isnull=1;}
if(MANAGERTYPE==null){managertype_isnull=1;}
if(NATRUST_TYPE==null){natrust_type_isnull=1;}
if(CUSTODIAN_BANK==null){custodian_bank_isnull=1;}
if(WITH_BANK_FLAG==null){with_bank_flag_isnull=1;}
if(WITH_SECURITY_FLAG==null){with_security_flag_isnull=1;}
if(WITH_PRIVATE_FLAG==null){with_private_flag_isnull=1;}
if(WITH_GOV_FLAG==null){with_gov_flag_isnull=1;}
if(BEN_PERIOD==null){ben_period_isnull=1;}
////////////////////////////////标准化校验枚举值赋值
var normalsql_intrust_type= "select count(1) from trust_tdictparam where type_id=1104 and type_value="+INTRUST_TYPE;
var normalsql_intrust_type_subitem= "select count(1) from trust_tdictparam where type_id=1151 and type_value="+INTRUST_TYPE_SUBITEM;
var normalsql_intrust_type1= "select count(1) from trust_tdictparam where type_id=1138 and type_value="+INTRUST_TYPE1;
var normalsql_intrust_type2= "select count(1) from trust_tdictparam where type_id=1139 and type_value="+INTRUST_TYPE2;
var normalsql_entity_type= "select count(1) from trust_tdictparam where type_id=1140 and type_value="+ENTITY_TYPE;
var normalsql_deal_type= "select count(1) from trust_tdictparam where type_id=1141 and type_value="+DEAL_TYPE;
var normalsql_natrust_type= "select count(1) from trust_tdictparam where type_id=1143 and type_value="+NATRUST_TYPE;
var normalsql_custodian_bank= "select count(1) from trust_tdictparam where type_id=1103 and type_value="+"'"+CUSTODIAN_BANK+"'";;
var normalsql_innovat_type= "select count(1) from trust_tdictparam where type_id=1104 and type_value="+INNOVAT_TYPE;
var normalsql_gov_regional= "select count(1) from trust_tdictparam where type_id=9999 and type_value="+GOV_PROV_REGIONAL;
if(fireToDB(strConn, normalsql_intrust_type)[0][0]>0){intrust_type_isnormal=1;}
if(fireToDB(strConn, normalsql_intrust_type_subitem)[0][0]>0){intrust_type_subitem_isnormal=1;}
if(fireToDB(strConn, normalsql_intrust_type1)[0][0]>0){intrust_type1_isnormal=1;}
if(fireToDB(strConn, normalsql_intrust_type2)[0][0]>0){intrust_type2_isnormal=1;}
if(fireToDB(strConn, normalsql_entity_type)[0][0]>0){entity_type_isnormal=1;}
if(fireToDB(strConn, normalsql_deal_type)[0][0]>0){deal_type_isnormal=1;}
if(fireToDB(strConn, normalsql_natrust_type)[0][0]>0){natrust_type_isnormal=1;}
if(fireToDB(strConn, normalsql_custodian_bank)[0][0]>0){custodian_bank_isnormal=1;}
if(fireToDB(strConn, normalsql_innovat_type)[0][0]>0){innovat_type_isnormal=1;}
if(fireToDB(strConn, normalsql_gov_regional)[0][0]>0){gov_regional_isnormal=1;}
////////////////////////////////数据类型校验枚举值赋值
if(isNum(BEN_PERIOD))
{
ben_period_isnumber=1;
}
//校验所有表需要校验的字段,如果有一个校验失败,则校验状态为1
if
(
item_id_isunique==0 || item_code_isunique==0 ||item_name_isunique==0|| //is unique
intrust_flag1_isnull==1 || intrust_type_isnull==1 || intrust_type_subitem_isnull==1 ||//is null
intrust_type1_isnull==1 || intrust_type2_isnull==1 || item_num_isnull==1 ||
item_money_isnull==1 || exp_rate1_isnull==1 || exp_rate2_isnull==1 ||
intrust_flag3_isnull==1 || intrust_flag4_isnull==1 || entity_type_isnull==1 ||
deal_type_isnull==1 || managertype_isnull==1 || natrust_type_isnull==1 ||
custodian_bank_isnull==1 || with_bank_flag_isnull==1 || with_security_flag_isnull==1 ||
with_private_flag_isnull==1 || with_gov_flag_isnull==1 || ben_period_isnull==1 ||
intrust_type_isnormal==0 || intrust_type_subitem_isnormal==0 || intrust_type1_isnormal==0 ||//is normal
intrust_type2_isnormal==0 || entity_type_isnormal==0 || deal_type_isnormal==0 ||
natrust_type_isnormal==0 || custodian_bank_isnormal==0 || innovat_type_isnormal==0 ||
bank_id_isnormal==0 || gov_regional_isnormal==0 ||
ben_period_isnumber==0//is number
)
{
check_status=1;
}
//check is unique? return not unique column
var isunique_column="";
if(item_id_isunique==0){isunique_column="item_id";}
if(item_code_isunique==0){if(isunique_column==""){isunique_column="item_code";}else{isunique_column=isunique_column+"、"+"item_code";}}
if(item_name_isunique==0){if(isunique_column==""){isunique_column="item_name";}else{isunique_column=isunique_column+"、"+"item_name";}}
//check is null? return null column
var isnull_column="";
if(intrust_flag1_isnull==1){isnull_column="intrust_flag1";}
if(intrust_type_isnull==1){if(isnull_column==""){isnull_column="intrust_type";}else{isnull_column=isnull_column+"、"+"intrust_type";}}
if(intrust_type_subitem_isnull==1){if(isnull_column==""){isnull_column="intrust_type_subitem";}else{isnull_column=isnull_column+"、"+"intrust_type_subitem";}}
if(intrust_type1_isnull==1){if(isnull_column==""){isnull_column="intrust_type1";}else{isnull_column=isnull_column+"、"+"intrust_type1";}}
if(intrust_type2_isnull==1){if(isnull_column==""){isnull_column="intrust_type2";}else{isnull_column=isnull_column+"、"+"intrust_type2";}}
if(item_num_isnull==1){if(isnull_column==""){isnull_column="item_num";}else{isnull_column=isnull_column+"、"+"item_num";}}
if(item_money_isnull==1){if(isnull_column==""){isnull_column="item_money";}else{isnull_column=isnull_column+"、"+"item_money";}}
if(exp_rate1_isnull==1){if(isnull_column==""){isnull_column="exp_rate1";}else{isnull_column=isnull_column+"、"+"exp_rate1";}}
if(exp_rate2_isnull==1){if(isnull_column==""){isnull_column="exp_rate2";}else{isnull_column=isnull_column+"、"+"exp_rate2";}}
if(intrust_flag3_isnull==1){if(isnull_column==""){isnull_column="intrust_flag3";}else{isnull_column=isnull_column+"、"+"intrust_flag3";}}
if(intrust_flag4_isnull==1){if(isnull_column==""){isnull_column="intrust_flag4";}else{isnull_column=isnull_column+"、"+"intrust_flag4";}}
if(entity_type_isnull==1){if(isnull_column==""){isnull_column="entity_type";}else{isnull_column=isnull_column+"、"+"entity_type";}}
if(deal_type_isnull==1){if(isnull_column==""){isnull_column="deal_type";}else{isnull_column=isnull_column+"、"+"deal_type";}}
if(managertype_isnull==1){if(isnull_column==""){isnull_column="managertype";}else{isnull_column=isnull_column+"、"+"managertype";}}
if(natrust_type_isnull==1){if(isnull_column==""){isnull_column="natrust_type";}else{isnull_column=isnull_column+"、"+"natrust_type";}}
if(custodian_bank_isnull==1){if(isnull_column==""){isnull_column="custodian_bank";}else{isnull_column=isnull_column+"、"+"custodian_bank";}}
if(with_bank_flag_isnull==1){if(isnull_column==""){isnull_column="with_bank_flag";}else{isnull_column=isnull_column+"、"+"with_bank_flag";}}
if(with_security_flag_isnull==1){if(isnull_column==""){isnull_column="with_security_flag";}else{isnull_column=isnull_column+"、"+"with_security_flag";}}
if(with_private_flag_isnull==1){if(isnull_column==""){isnull_column="with_private_flag";}else{isnull_column=isnull_column+"、"+"with_private_flag";}}
if(with_gov_flag_isnull==1){if(isnull_column==""){isnull_column="with_gov_flag";}else{isnull_column=isnull_column+"、"+"with_gov_flag";}}
if(ben_period_isnull==1){if(isnull_column==""){isnull_column="ben_period";}else{isnull_column=isnull_column+"、"+"ben_period";}}
//check is normal? return not normal column
var isnormal_column="";
if(intrust_type_isnormal==0){isnormal_column="intrust_type";}
if(intrust_type_subitem_isnormal==0){if(isnormal_column==""){isnormal_column="intrust_type_subitem";}else{isnormal_column=isnormal_column+"、"+"intrust_type_subitem";}}
if(intrust_type1_isnormal==0){if(isnormal_column==""){isnormal_column="intrust_type1";}else{isnormal_column=isnormal_column+"、"+"intrust_type1";}}
if(intrust_type2_isnormal==0){if(isnormal_column==""){isnormal_column="intrust_type2";}else{isnormal_column=isnormal_column+"、"+"intrust_type2";}}
if(entity_type_isnormal==0){if(isnormal_column==""){isnormal_column="entity_type";}else{isnormal_column=isnormal_column+"、"+"entity_type";}}
if(deal_type_isnormal==0){if(isnormal_column==""){isnormal_column="deal_type";}else{isnormal_column=isnormal_column+"、"+"deal_type";}}
if(natrust_type_isnormal==0){if(isnormal_column==""){isnormal_column="natrust_type";}else{isnormal_column=isnormal_column+"、"+"natrust_type";}}
if(custodian_bank_isnormal==0){if(isnormal_column==""){isnormal_column="custodian_bank";}else{isnormal_column=isnormal_column+"、"+"custodian_bank";}}
if(innovat_type_isnormal==0){if(isnormal_column==""){isnormal_column="iinnovat_type";}else{isnormal_column=isnormal_column+"、"+"innovat_type";}}
if(bank_id_isnormal==0){if(isnormal_column==""){isnormal_column="bank_id";}else{isnormal_column=isnormal_column+"、"+"bank_id";}}
if(gov_regional_isnormal==0){if(isnormal_column==""){isnormal_column="gov_regional";}else{isnormal_column=isnormal_column+"、"+"gov_regional";}}
//check is number? return not number column
var isnumber_column="";
if(ben_period_isnumber==0)
{
isnumber_column="ben_period";
}
//最终输出的错误详细情况
if(item_id_isunique==0 || item_code_isunique==0 ||item_name_isunique==0)
{
check_type="违反唯一规则";
check_detail="表"+source_table+"中,字段"+isunique_column+"违反了唯一规则";
}
if
(
intrust_flag1_isnull==1 || intrust_type_isnull==1 || intrust_type_subitem_isnull==1 ||
intrust_type1_isnull==1 || intrust_type2_isnull==1 || item_num_isnull==1 ||
item_money_isnull==1 || exp_rate1_isnull==1 || exp_rate2_isnull==1||
intrust_flag3_isnull==1 || intrust_flag4_isnull==1 || entity_type_isnull==1 ||
deal_type_isnull==1 || managertype_isnull==1 || natrust_type_isnull==1 ||
custodian_bank_isnull==1 || with_bank_flag_isnull==1 || with_security_flag_isnull==1 ||
with_private_flag_isnull==1 || with_gov_flag_isnull==1 || ben_period_isnull==1
)
{
if(check_detail=="")
{
check_type="违反非空规则";
check_detail="字段"+isnull_column+"违反了非空规则"; }
else
{
check_type=check_type+","+"违反非空规则";
check_detail=check_detail+",字段"+isnull_column+"违反了非空规则";
}
}
if
(
intrust_type_isnormal==0 || intrust_type_subitem_isnormal==0 || intrust_type1_isnormal==0 ||
intrust_type2_isnormal==0 || entity_type_isnormal==0 || deal_type_isnormal==0 ||
natrust_type_isnormal==0 || custodian_bank_isnormal==0 || innovat_type_isnormal==0 ||
bank_id_isnormal==0 || gov_regional_isnormal==0
)
{
if(check_detail=="")
{
check_type="违反标准化规则";
check_detail="字段"+isnormal_column+"违反了标准化规则";
}
else
{
check_type=check_type+","+"违反标准化规则";
check_detail=check_detail+",字段"+isnormal_column+"违反了标准化规则";
}
} if(ben_period_isnumber==0)
{
if(check_detail=="")
{
check_type="违反数据类型为数字规则";
check_detail="字段"+isnumber_column+"违反了数据类型为数字规则";
}
else
{
check_type=check_type+","+"违反数据类型为数字规则";
check_detail=check_detail+",字段"+isnumber_column+"违反了数据类型为数字规则";
}
}
if(check_detail!="")
{
check_detail=check_detail+","+source_table_id+"="+ITEM_ID;
}
check_name=ITEM_NAME;
校验日志表结果:
输出关键性指标-表,那些字段违反了那些规则,时间

利用kettle中的JS来完成ETL数据校验的更多相关文章
- 巧妙利用selenium中的JS操作来处理特殊的文本框
在使用selenium对页面进行相关操作时,有时候会遇到以下三种情况: 1.日期框:无法直接输入文本,必须要选择某一天的日期并点击才会填入文本框: 2.检索框:可以直接输入文本,但必须要点击根据输入的 ...
- 利用Kettle进行SQLServer与Oracle之间的数据迁移实践
Kettle简介 Kettle(网地址为http://kettle.pentaho.org/)是一款国外开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,数据抽取高效 ...
- 在java中像js那样处理json数据
工作中经常需要通过ajax向前台返回json数据,都是通过拼字符串拼出来的,很发麻烦不说,还容易出错. 于是想,能不能像js那样操作json呢?或者说更方便的操作呢? Google的gson就是这样的 ...
- Kettle中ETL的效率优化
ETL效率优化 开启数据库日志记录及性能监控 如果我们想要优化一个ETL(KTR或者KJB)的性能,我们首先需要知道的就是它的瓶颈在哪里.而这些信息一般只能在ETL运行的步骤度量中看到,并且是不会持久 ...
- 关于NLPIR应用在KETTLE中的探索
一:什么是NLPIR? NLPIR汉语分词系统(自然语言处理与信息检索共享平台),主要功能包括中文分词:词性标注:命名实体识别:用户词典功能:支持GBK编码.UTF8编码.BIG5编码.新增微博分词. ...
- Kettle中根据一个输入行派生出多个输出行
依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用ETL工具kettle做数据校验的时候遇到的一些问题,一级解决方案. 1:数据校验效果图下图: 原始表数据(需要校验的表数据) 对上表数 ...
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...
- html中使用js+table 实现分页
本文在html中利用js+table实现分页.主要思想是先对table中的所有数据隐藏,然后通过当前页面(currPageNum)来计算当前页要显示的行,并显示出来,首页.下一页.上一页.尾页都依此来 ...
- MVC中的JS和CSS压缩
小说一下Js和CSS压缩的好处: 1.减小了文件的体积 2.减小了网络传输量和带宽占用 3.减小了服务器的处理的压力 4.提高了页面的渲染显示的速度 很多建议将站点的静态文件(如图片.js.css ...
随机推荐
- Wannafly挑战赛7 E - 珂朵莉与GCD
题目描述 给你一个长为n的序列a m次查询 每次查询一个区间的所有子区间的gcd的和mod1e9+7的结果 输入描述: 第一行两个数n,m之后一行n个数表示a之后m行每行两个数l,r表示查询的区间 输 ...
- JOYOI 西瓜种植 [差分约束系统]
题目传送门 西瓜种植 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 笨笨:小西瓜,小西瓜~路人甲:不会呀,这西瓜明明就大着啊…… ...
- java console 到文件
System.setOut(new PrintStream(new FileOutputStream("c:\\temp\\test1.txt"))); System.out.pr ...
- WebLogic Server
前几天,看了几集J2ee , 给我的感觉就是,看不懂!! 一点也不懂! 那怎么办呢? 听老师的,不管懂不懂,先看看再说.接下来,就开始了J2ee "艰苦"的历程.在J2ee中,经常 ...
- 又见Python<2>:如何安装第三方库(Windows)
使用python进行数据分析或者数据处理时,往往需要使用一些库,而使用库之前必须安装它.Anaconda内置了很多常用的第三方库,可以满足绝大部分需求,比如numpy.pandas.matplotli ...
- bzoj4556: [Tjoi2016&Heoi2016]字符串 (后缀数组加主席树)
题目是给出一个字符串,每次询问一个区间[a,b]中所有的子串和另一个区间[c,d]的lcp最大值,首先求出后缀数组,对于lcp的最大值肯定是rank[c]的前驱和后继,但是对于这个题会出现问题,就是题 ...
- 【UOJ244】[UER7]短路
[题目大意] (2n+1)*(2n+1)的矩形,由里到外每一层都有一个相同的值.问从左上走到右小经过的点累和的最小值. [思路] 一眼就是贪心.首先能够想到的是,权值最小的那些边要尽可能夺走,所以必定 ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- hdu 3681 压缩dp+搜索
题意:一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器, 只可充电一次,但是可以经过很多次.'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次. ...
- Java并发(十五):并发工具类——信号量Semaphore
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...