博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kettle java获取变量_Kettle的第二个实践--数据获取并转换
阅读量:5106 次
发布时间:2019-06-13

本文共 2147 字,大约阅读时间需要 7 分钟。

需求:

kettletest1数据库中有table_source数据表,结构如下: Id                主键

t_id             数据时间

part_id        实例ID

yg               数据字段1

wg              数据字段2

该表中的数据对于不同的实例ID,一分钟一条数据,t_id字段表示数据的时间,精确到分钟。

kettletest2数据库中有table_target数据表,结构如下: Id                     主键

marketdate      数据日期,格式为 yyyy-MM-dd

pointtime        时间,格式为 HH:mm

pointnumber   时间的数字表示,00:01表示为1,00:00表示为1440

plantcode        实例Code

yg                    数据字段1

wg                   数据字段2

需定期将table_source表中的数据获取至table_target表中,并进行如下处理: 1、将t_id数据时间字段拆分为三个字段,分别为marketdate、pointtime、pointnumber。 a、marketdate取t_id的日期部分。

b、pointtime取t_id的时间部分。

c、pointnumber为时间的数字表示,等于hour*60+minute。

d、但当t_id的时间为某日的00:00时,需将其转化为24:00,并且marketdate需取日期的前一天。如t_id为2008-12-04 00:00,则marketdate为2008-12-03,pointtime为24:00,pointnumber为1440。 2、将part_id字段映射为plantcode字段,并根据如下规则进行转换:

part_id                 plantcode

3206                        P01

3207                        P02

3208                        P03

测试中使用的数据库均为mysql数据库。

实战:

整个转换工作共分为三个步骤,如下图:

9039492ba747b742ad621177b6c52e23.png 1、定义需获取的数据的日期

0b1b3709acb3759bf106a2bc1db3a2b2.png 2、删除table_target表中已有数据,注意一定要将“执行SQl语句”面板中的“变量替换”要选上,否则SQL语句中的变量不会被替换,我刚开始没注意到这个地方,找问题找了半天。

b6834e12036cad02b526231aa7db87eb.png 3、获取table_source中的数据,并将其插入table_target表

f0495f8ae1748f14fb0798ebddcc46bb.png 3-1、获取table_source表的数据

07717ece36a836f3751e59606b24b61b.png 3-2、值映射

0baf2ddfb0acae3d79433d6293558808.png 3-3、字段选择

39d69e9613c430ae6f3621dd370990be.png 3-4、对t_id字段进行处理,增加了pointnumber字段。在这一步骤中发现kettle的一个bug,就是不能在JavaScript中使用str2date函数,错误的具体信息参见:http://jira.pentaho.com/browse/PDI-1827。这个问题也折腾了好长时间,刚开始怎么也想不通这个函数使用时怎么会报错呢,后来只好从字符串中截取年、月、日信息。

该步骤中还存在另外一个使人困惑的问题,就是点击“测试脚本”按钮,会报错,但是执行job和transformation时则不会报错。

0f0fa34e95296eb9fa23931805428049.png 3-5、增加pointnumber字段至输出结果中

f7a5cc51a52a741f0a2ea6196ebcdfe5.png 3-6、插入数据至table_target表

d6be6c98712402ebcde607c7954ab334.png

3-4步骤中的JavaScript代码如下:

varpointTimeStr=pointtime.getString();varpointnumber=1;if(pointTimeStr=="00:00") {varmarketDateStr=marketdate.getString();varmarketDateYear=substr(marketDateStr,0,4);varmarketDateMonth=str2num(substr(marketDateStr,5,2))-1;varmarketDateDay=substr(marketDateStr,8,2);vardate=newDate();

date.setYear(marketDateYear);

date.setMonth(marketDateMonth);

date.setDate(marketDateDay);vartemp1=dateAdd(date,"d",-1);

marketdate.setValue(date2str(temp1,"yyyy-MM-dd"));

pointtime.setValue("24:00");

pointnumber=1440;

}else{varhourStr=pointTimeStr.substr(0,2);varhour=str2num(hourStr);varminuteStr=pointTimeStr.substr(3,5);varminute=str2num(minuteStr);

pointnumber=hour*60+minute;

}

至此,整个转换工作完成,小结一下:

如果对kettle等etl工具比较熟悉的话,使用etl工具进行数据转换、抽取等事情还是比较方便的,比起写程序还是有优势的。但是这个转换过程中遇到的kettle的两个bug比较让人头疼,觉得kettle好像还不是很稳定。

posted on 2008-12-14 21:55 The Matrix 阅读(33275) 评论(5)  编辑  收藏 所属分类: Kettle

转载地址:http://pqudv.baihongyu.com/

你可能感兴趣的文章
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
视频:"我是设计师"高清完整版Plus拍摄花絮
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
iframe跨域与session失效问题
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
Hash和Bloom Filter
查看>>