1、kettle介绍
ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),用于执行数据的处理,转换,迁移的工具。Kettle(现在已经更名为PDI,Pentaho Data Integration-Pentaho)是一款国外开源的ETL工具,纯java编写。kettle的文件类型分为两种kjb、ktr:
- kjb:就是job,可以用来控制 transformation 的运行流程,可以顺序执行或者并发运行;或者脚本;或者设置变量;传输文件;运行shell等;
- ktr:就是transform,转换。具体的数据处理步骤,一般情况包含一个input和一个output。在input和output之间可以执行各式各样的转换操作。
2、kettle转换
- 输入控件:输入是转换里面的第一个分类,输入控件也是转换中的第一大控件,用来抽取数据或者生成数据。输入是ETL里面的E(Extract),主要做数据提取的工作。例如表输入。
- 输出控件:输出是转换里面的第二个分类,输出控件也是转换中的第二大控件,用来存储数据。输出是ETL里面的L(Load),主要做数据加载的工作。例如表输出。
- 转换控件:转换控件是转换中的第三大控件,用来转换数据。转换是ETL里面的T(Transform),主要做数据转换,数据清洗的工作。
3、kettle作业
大多数ETL项目都需要完成各种各样的维护工作。例如,如何传送文件;验证数据库表是否存在等等。而这些操作都是按照一定顺序完成。因为转换以并行方式执行,就需要一个可以串行执行的作业来处理这些操作。一个作业包含一个或者多个作业项,这些作业项以某种顺序来执行。作业执行顺序由作业项之间的跳(job hop)和每个作业项的执行结果来决定。
4、Kettle核心概念
转换(Transform)是ETL解决方案中最主要的部分,转换包含一个或多个步骤(step),如读取文件、过滤数据行、数据清洗或将数据加载到数据库。转换里的步骤通过跳(hop)来连接,跳定义一个单向通道,允许数据从一个步骤向另一个步骤流动。在Kettle里,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤的移动。
步骤(控件)是转换里的基本的组成部分。一个步骤有如下几个关键特性:
①步骤需要有一个名字,这个名字在转换范围内唯一。
②每个步骤都会读、 写数据行(唯一例外是“生成记录”步骤,该步骤只写数据)。
③步骤将数据写到与之相连的一个或多个输出跳,再传送到跳的另一端的步骤。
④大多数的步骤都可以有多个输出跳。一个步骤的数据发送可以被设置为分发和复制,分发是目标步骤轮流接收记录,复制是所有的记录被同时发送到所有的目标步骤。
数据行-数据类型
数据以数据行的形式沿着步骤移动。一个数据行是零到多个字段的集合,字段包含下面几种数据类型。
①String:字符类型数据
②Number:双精度浮点数。
③Integer:带符号长整型(64位)。
④BigNumber:任意精度数据。
⑤Date:带毫秒精度的日期时间值。
⑥Boolean:取值为true和false的布尔值。
⑦Binary:二进制字段可以包含图像、声音、视频及其他类型的二进制数据。
数据行-元数据
每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据。通常包含下面一些信息。
①名称:行里的字段名应用是唯一的。
②数据类型:字段的数据类型。
③格式:数据显示的方式,如Integer的#、 0.00。
④长度:字符串的长度或者BigNumber类型的长度。
⑤精度:BigNumber数据类型的十进制精度。
⑥货币符号:¥
⑦小数点符号:十进制数据的小数点格式。不同文化背景下小数点符号是不同的,一般是点(.)或逗号(,)。
⑧分组符号:数值类型数据的分组符号,不同文化背景下数字里的分组符号也是不同的,一般是点(.)或逗号(,)或单引号(’)
5、重点举例
作业是步骤流,转换是数据流,这是作业和转换最大的区别。作业的每一个步骤,必须等到前面的步骤都跑完了,后面的步骤才会执行;而转换会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录、一条记录地流向最后的控件;
步骤就是完成工作的其中一个阶段,每个步骤都完成了一件独立的事情,步骤与步骤之间是独立的,但有先后顺序,步骤的组合可以形成一个工作流。数据流是指从输入控件(Input)到输出控件(Output)之间的数据流动,针对的是在数据流动过程中的每一行记录、每一列数据的处理 。
作业的控件:
Mail -> Mail:用于发送一份邮件;
File Managemeng -> Create a File:用于创建一个文件;
Conditions -> File Exists:判断文件是否存在;
Scripting -> SQL:用于执行一段SQL
等等,以上控件都是完成了一项单独的工作,并不需要我们很细致地指定一条条记录如何处理。
转换的控件:
Input -> Text File Input:加载一个文本文件的记录,可以指定每个字段的类型、长度、分隔符等;
Output -> Text File Output:把记录写到一个文本文件,可以指定每个字段的类型、字符集、长度、分隔符、日期格式等;
Transform -> Concat Fields:把2个字段合并成一个新的字段;
Utility -> Write to log:把每一行记录的每个字段写到日志去;
等等,以上控件针对的都是每行记录、每个字段进行处理,必须要有输入 -> 输出,以输入控件开始,以输出控件结束。