随笔-75  评论-193  文章-5  trackbacks-0

需求:

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好像还不是很稳定。

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

评论:
# re: Kettle的第二个实践--数据获取并转换 2009-01-06 19:59 | Eric sune
你好,我最近也刚刚开始使用这个工具,请问一下 执行SQL的时候 里面的参数要如何才能传递进去?  回复  更多评论
  
# re: Kettle的第二个实践--数据获取并转换 2009-01-09 13:11 | The Matrix
@Eric sune
在上面的这个例子中,define acquire date步骤就定义了获取日期参数,然后在后面的删除数据的sql中就用到了该参数  回复  更多评论
  
# re: Kettle的第二个实践--数据获取并转换 2009-05-05 17:25 | 初学者
我想要从上面的查询结果来获取数据怎么办?
你这里是从系统参数里来获取的,谢谢。  回复  更多评论
  
# re: Kettle的第二个实践--数据获取并转换[未登录] 2011-03-17 16:51 | fd
ggdgdgd  回复  更多评论
  
# re: Kettle的第二个实践--数据获取并转换 2013-03-27 15:27 | 少年了没
执行sql语句的结果怎么取得  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: