Kettle--数据获取并转换

标签:
kettle获取转换it |
分类: BI--数据库 |
需求:
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数据库。
实战:
整个转换工作共分为三个步骤,如下图:
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/job_thumb.jpg
1、定义需获取的数据的日期
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans1_thumb.jpg
2、删除table_target表中已有数据,注意一定要将“执行SQl语句”面板中的“变量替换”要选上,否则SQL语句中的变量不会被替换,我刚开始没注意到这个地方,找问题找了半天。
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans2_thumb.jpg
3、获取table_source中的数据,并将其插入table_target表
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3_thumb_1.jpg
3-1、获取table_source表的数据
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-1_thumb.jpg
3-2、值映射
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-2_thumb.jpg
3-3、字段选择
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-3_thumb.jpg
3-4、对t_id字段进行处理,增加了pointnumber字段。在这一步骤中发现kettle的一个bug,就是不能在JavaScript中使用str2date函数,错误的具体信息参见:http://jira.pentaho.com/browse/PDI-1827。这个问题也折腾了好长时间,刚开始怎么也想不通这个函数使用时怎么会报错呢,后来只好从字符串中截取年、月、日信息。
该步骤中还存在另外一个使人困惑的问题,就是点击“测试脚本”按钮,会报错,但是执行job和transformation时则不会报错。
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-4_thumb_1.jpg
3-5、增加pointnumber字段至输出结果中
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-5_thumb.jpg
3-6、插入数据至table_target表
http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-6_thumb.jpg
3-4步骤中的JavaScript代码如下:
var pointnumber =
if (pointTimeStr ==
} else {
}
至此,整个转换工作完成,小结一下: