Kettle--数据获取并转换
2013-12-05 22:07
375 查看
需求:
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数据库。
实战:
整个转换工作共分为三个步骤,如下图:
1、定义需获取的数据的日期
2、删除table_target表中已有数据,注意一定要将“执行SQl语句”面板中的“变量替换”要选上,否则SQL语句中的变量不会被替换,我刚开始没注意到这个地方,找问题找了半天。
3、获取table_source中的数据,并将其插入table_target表
3-1、获取table_source表的数据
3-2、值映射
3-3、字段选择
3-4、对t_id字段进行处理,增加了pointnumber字段。在这一步骤中发现kettle的一个bug,就是不能在JavaScript中使用str2date函数,错误的具体信息参见:http://jira.pentaho.com/browse/PDI-1827。这个问题也折腾了好长时间,刚开始怎么也想不通这个函数使用时怎么会报错呢,后来只好从字符串中截取年、月、日信息。
该步骤中还存在另外一个使人困惑的问题,就是点击“测试脚本”按钮,会报错,但是执行job和transformation时则不会报错。
3-5、增加pointnumber字段至输出结果中
3-6、插入数据至table_target表
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好像还不是很稳定。
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数据库。
实战:
整个转换工作共分为三个步骤,如下图:
1、定义需获取的数据的日期
2、删除table_target表中已有数据,注意一定要将“执行SQl语句”面板中的“变量替换”要选上,否则SQL语句中的变量不会被替换,我刚开始没注意到这个地方,找问题找了半天。
3、获取table_source中的数据,并将其插入table_target表
3-1、获取table_source表的数据
3-2、值映射
3-3、字段选择
3-4、对t_id字段进行处理,增加了pointnumber字段。在这一步骤中发现kettle的一个bug,就是不能在JavaScript中使用str2date函数,错误的具体信息参见:http://jira.pentaho.com/browse/PDI-1827。这个问题也折腾了好长时间,刚开始怎么也想不通这个函数使用时怎么会报错呢,后来只好从字符串中截取年、月、日信息。
该步骤中还存在另外一个使人困惑的问题,就是点击“测试脚本”按钮,会报错,但是执行job和transformation时则不会报错。
3-5、增加pointnumber字段至输出结果中
3-6、插入数据至table_target表
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好像还不是很稳定。
相关文章推荐
- Kettle的第二个实践--数据获取并转换
- 通过摄像机视频设备或者流媒体服务器SDK获取到数据转换成RTMP流实现网页/手机微信播放
- 关于selectize,ajax动态获取数据,数据类型转换
- [Java]nio( 4000 二)——转换数据(编码问题)和获取基本数据类型
- java 图片缩放,获取图片类型,字节数据和流的转换
- 前台js获取到后台json数据,eval解析json后,日期(object)对象转换为date日期格式显示
- 实现日夜间转换获取数据上下刷新(main)
- 如何从EditText 获取信息(包含强制转换数据类型)
- kettle转换JavaScript获取命令行参数
- 实现日夜间转换获取数据上下刷新(myAdapter)
- 如何将GPS直接获取的数据转换为“ 度°分′秒″ ”样式
- 不需要存入文件,直接将获取的数据转换成甘特图所需的数据格式并显示
- XCode数据类型转换代码 文件读取,写入,XY坐标获取,ASCII转换等
- 从一个小项目了解自动获取、提交网页数据、字符转换、自动注册的过程
- js获取Url后的数据转换为json
- java 把string数据转换成date数据存入mysql的问题,如何获取当前时间date存入数据库
- golang获取数据表转换为json通用方法
- 实现日夜间转换获取数据上下刷新(MyApplication)
- 获取节点,转换为json数据