公司领导交给我了一个活,让我用etl工具将数据清洗,并同步到我们公司的数据中心,于是我便在网上找教程学习了etl。

ETL

ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少,这里我介绍一个我在工作中使用了3年左右的ETL工具Kettle,本着好东西不独享的想法,跟大家分享碰撞交流一下!在使用中我感觉这个工具真的很强大,支持图形化的GUI设计界面,然后可以以工作流的形式流转,在做一些简单或复杂的数据抽取、质量检测、数据清洗、数据转换、数据过滤等方面有着比较稳定的表现,其中最主要的我们通过熟练的应用它,减少了非常多的研发工作量,提高了我们的工作效率,不过对于我这个.net研发者来说唯一的遗憾就是这个工具是Java编写的。

开源框架kettle

1、Kettle概念

Kettle是一款用java编写的开源ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。 Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。 Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。

2、下载和部署

žKettle可以在点下载 ž ž下载kettle压缩包,因kettle为绿色软件,解压缩到任意本地路径即可 3、Kettle环境配置(有Java环境的直接忽略此章节) 4、由于kettle是用java编写的,所以需要安装java环境,需要安装jdk并配置环境变量。

kettle的使用

作业(job)

负责将[转换]组织在一起进而完成某一块工作,通常我们需要把一个大的任务分解成几个逻辑上隔离的作业,当这几个作业都完成了,也就说明这项任务完成了。 1.Job Entry:一个Job Entry 是一个任务的一部分,它执行某些内容。 2.Hop:一个Hop 代表两个步骤之间的一个或者多个数据流。一个Hop 总是代表着两个Job Entry 之间的连接,并且能够被原始的Job Entry 设置,无条件的执行下一个Job Entry, 直到执行成功或者失败。 3.Note:一个Note 是一个任务附加的文本注释信息。 file

转换(Transformation)

定义对数据操作的容器,数据操作就是数据从输入到输出的一个过程,可以理解为比作业粒度更小一级的容器,我们将任务分解成作业,然后需要将作业分解成一个或多个转换,每个转换只完成一部分工作。

1.Value:Value 是行的一部分,并且是包含以下类型的的数据:Strings、floating point Numbers、unlimited precision BigNumbers、Integers、Dates、或者Boolean。 2.Row:一行包含0 个或者多个Values。 3.Output Stream:一个Output Stream 是离开一个步骤时的行的堆栈。 4.Input Stream:一个Input Stream 是进入一个步骤时的行的堆栈。 5.Step:转换的一个步骤,可以是一个Stream或是其他元素。 6.Hop:一个Hop 代表两个步骤之间的一个或者多个数据流。一个Hop 总是代表着一个步骤的输出流和一个步骤的输入流。 7.Note:一个Note 是一个转换附加的文本注释信息。 file

ž4.1 Kettle使用 Kettle提供了资源库方式的方式来整合所有的工作,但是因为资源库移植不方便,所以我们选择没有资源库; 1)创建一个新的transformation,点击 保存到本地路径,例如保存到D:/etltest下,保存文件名为EtltestTrans,kettle默认transformation文件保存后后缀名为ktr; 2)创建一个新的job,点击 保存到本地路径,例如保存到D:/etltest下,保存文件名为EtltestJob,kettle默认job文件保存后后缀名为kjb; 3) 新建转换, 然后连接源数据库和目标数据库,将源数据库的数据导入到目标数据库。 大致流程如下,对源数据源转换后的数据列表进行遍历,然后对目标数据源进行转换: file

这是一个Kettle 的作业,第一个转换内容是查询的表数据,同时复制到记录上。

file 表输入中的语句为:

select * from hbp_record –hbp_record

代表的查询的表名。 值得注意的是:在这里只是为了测试循环遍历的整个流程,整个转换在使用时使用的应该是配置文件,通用的配置文件。 第二个 遍历获取功能是一个JavaScript脚本验证,主要使用的是获取上一个转换传递过来的数据。具体代码如下:

var prevRow=previous_result.getRows();//获取上一个传递的结果
if (prevRow == null &&(prevRow.size()=0))
{
    false;

}else{
    parent_job.setVariable("tables", prevRow);//ArrayList存储表名变量,以数组形式保存入table1,table2
    parent_job.setVariable("size", prevRow.size());//存储执行表的总数量
    parent_job.setVariable("i", 0);//循环控制变量
    /**
    TABLENAME 这里写死了,hbp_record 代表了需要查询的表,
    prevRow.get(0).getString("TABLES","")//这是通用版的
    */
    parent_job.setVariable("TABLENAME","HBP_RECORD");
    true;
}

第三步:检验字段的值 这个步骤代表类似Java中的for循环语句,进行循环遍历数据使用的,配置信息如下: file 第五步:再次使用Javascript的脚步验证 主要功能是:进行数据的累加,遍历执行表的数据 代码如下:

var list_Tables =parent_job.getVariable("tables").replace("[","").replace("]","").split(",");
var size = new Number(parent_job.getVariable("size"));
var i = new Number(parent_job.getVariable("i"))+1;
if(i<size){
    parent_job.setVariable("TABLENAME", list_Tables[i]);
}
parent_job.setVariable("i",i);
true;

file

file