Kettle的第二个实践--数据获取并转换

Kettle的第二个实践--数据获取并转换

需求:

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数据库。
实战:

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


[img]http://dl.iteye.com/upload/attachment/0081/1511/96936da2-662f-3692-bcbc-0e8a407b5734.jpg[/img]

1、定义需获取的数据的日期

[img]http://dl.iteye.com/upload/attachment/0081/1515/61b03c9e-3258-3381-9ad8-778c43e2beb7.jpg[/img]

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

[img]http://dl.iteye.com/upload/attachment/0081/1519/9d8080b8-f1d5-310d-b1c3-4541f9bf6c51.jpg[/img]

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

[img]http://dl.iteye.com/upload/attachment/0081/1526/58202446-d346-3569-8c04-a5c0d2f9dd45.jpg[/img]


3-1、获取table_source表的数据

[img]http://dl.iteye.com/upload/attachment/0081/1528/6bd56eb2-929e-37ba-b93c-019db982a9ef.jpg[/img]

3-2、值映射

[img]http://dl.iteye.com/upload/attachment/0081/1537/4715176a-4dc0-3523-82c0-5e43db4e0db7.jpg[/img]

3-3、字段选择

[img]http://dl.iteye.com/upload/attachment/0081/1541/c63882e9-ae3c-3ff3-8ee4-2dc6e3e461c1.jpg[/img]

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

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


[img]http://dl.iteye.com/upload/attachment/0081/1546/f906a4ed-66eb-3e1d-ac3c-ae190b4a3bd1.jpg[/img]

3-5、增加pointnumber字段至输出结果中

[img]http://dl.iteye.com/upload/attachment/0081/1548/42dbe693-d7e7-36c2-80d5-8817c4655775.jpg[/img]

3-6、插入数据至table_target表

[img]http://dl.iteye.com/upload/attachment/0081/1553/549ebe07-3256-3343-b5d9-02df0365b83e.jpg[/img]

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

var pointTimeStr = pointtime.getString();
var pointnumber = 1;

if (pointTimeStr == "00:00") {

var marketDateStr = marketdate.getString();
var marketDateYear = substr(marketDateStr, 0, 4);
var marketDateMonth = str2num(substr(marketDateStr, 5, 2))-1;
var marketDateDay = substr(marketDateStr, 8, 2);

var date = new Date();
date.setYear(marketDateYear);
date.setMonth(marketDateMonth);
date.setDate(marketDateDay);

var temp1 = dateAdd(date, "d", -1);
marketdate.setValue(date2str(temp1, "yyyy-MM-dd"));
pointtime.setValue("24:00");

pointnumber = 1440;
} else {
var hourStr = pointTimeStr.substr(0, 2);
var hour = str2num(hourStr);
var minuteStr = pointTimeStr.substr(3, 5);
var minute = str2num(minuteStr);

pointnumber = hour * 60 + minute;
}


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

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

reference:http://www.blogjava.net/robbie/archive/2008/12/14/246271.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值