Kettle--数据获取并转换

转载 2013年12月05日 22:07:00

需求:

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

  1. Id 主键
  2. t_id 数据时间
  3. part_id 实例ID
  4. yg 数据字段1
  5. wg 数据字段2

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

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

  1. Id 主键
  2. marketdate 数据日期,格式为 yyyy-MM-dd
  3. pointtime 时间,格式为 HH:mm
  4. pointnumber 时间的数字表示,00:01表示为1,00:00表示为1440
  5. plantcode 实例Code
  6. yg 数据字段1
  7. 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数据库。

实战:

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

job

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

trans1

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

trans2

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

trans3

3-1、获取table_source表的数据

trans3-1

3-2、值映射

trans3-2

3-3、字段选择

trans3-3

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

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

trans3-4

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

trans3-5

3-6、插入数据至table_target表

trans3-6

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之时间转换异常

昨天在进行数据抽取时,发现了一个很奇怪的现象,部分时间,在经过kettle表输入再输出时,发生了变化。 具体说来就是:在数据库中,时间是1988/04/10 00:00:00,但是在kettle表输...
  • cakecc2008
  • cakecc2008
  • 2017年02月10日 13:09
  • 1633

KETTLE中,str2date 英文日期的转化

KETTLE中 javascript代码 11/Mar/2015:11:35:29 +0800  var strArray =ltime.split(" "); var date...
  • bhltweb
  • bhltweb
  • 2015年03月17日 13:41
  • 5768

在Kettle里使用时间戳实现变化数据捕获(CDC)

1. 建立测试表,插入数据。use test; create table t_color ( id int unsigned not null auto_increment pr...
  • wzy0623
  • wzy0623
  • 2016年12月26日 14:03
  • 4190

KETTLE文本型转换为日期型处理

  • 2013年12月25日 11:28
  • 14KB
  • 下载

kettle转换中使用javascript例子整理(2)

7(重) JavaScript -dialog.ktr(需要调用Java代码,有界面) // This JavaScript asks for a start and e...
  • man_earth
  • man_earth
  • 2014年10月27日 11:37
  • 3945

Kettle与动态转换(JavaScript脚本)

Kettle使用的是JavaScript来作为它的脚本实现,使用的是mozilla 的rhino 1.5r5版本实现,如果你打算实现一些复杂的计算过程,比如字符串分割,数据类型转换,条件计算等等,...
  • u011715213
  • u011715213
  • 2015年02月06日 11:04
  • 1331

KETTLE——(例)简单的字段转换

一个简单的小例子:结合数据抽取、简单的字段转换、数据输出。 资源库连接、数据输入、数据输出、参见之前的文章。 基本的转换结构是这样的,我们从表中输入,选择我们需要的字段,已经对应的...
  • jasionder
  • jasionder
  • 2016年03月09日 11:21
  • 7930

【Kettle从零开始】第五弹之Kettle转换中常用组件介绍

Kettle版本:3.2GA JDK版本:1.6.0_41 OS:NT 由于组件涉及非常多,我这就只举例几个常用的组件来进行介绍。需要了解全部组件下载 Kettle用户手册下载  表输入(Table ...
  • yvigmmwfn
  • yvigmmwfn
  • 2014年03月10日 23:53
  • 10795

kettle详解(数据抽取、转换、装载)

一:下载路径 当你要学习一个工具时,往往一开始就找不到下载路径,也不知道是为什么,连个官网都找不到,最后还是问的别人要的路径,做程序好心酸。 http://community.pentah...
  • qq_35731570
  • qq_35731570
  • 2017年05月03日 14:48
  • 3334

KETTLE数据库转换类型例子

  • 2009年08月25日 21:14
  • 335KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Kettle--数据获取并转换
举报原因:
原因补充:

(最多只允许输入30个字)