您的位置:首页 > Web前端 > JavaScript

kettle应用实践

2010-11-25 09:21 190 查看
        给大家介绍一个数据提取和转换的工具:Kettle是一款国外开源的etl工具,纯java编写的,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。这个ETL的开源项目的名称,很有意思,直译中文为“水壶”。按项目负责人Matt的说法:把各种数据发到一个壶里,然后呢,以一种你希望的格式流出。  

        Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。作为Pentaho的一个重要组成部分,并且百度的数据仓库项目也用到了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工具进行数据转换、抽取等事情还是比较方便的,比起写程序还是有优势的。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息