一、概述
1.什么是kettle
Kettle是一款开源的ETL(Extract-Transform-Load)工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。
![image-20230312122610549](https://i-blog.csdnimg.cn/blog_migrate/263708e210f1ae17a8371455a2032afd.png)
2.kettle工程存储方式
(1)以XML形式存储
(2)以资源库方式存储(数据库资源库和文件资源库)
3.kettle两种设计
- Transformation(转换):完成对数据的基本转换
- Job(工作):完成整个工作流的控制
区别:
(1)作业(Job)是步骤流,转换(Transformation)是数据流。
(2)作业的每一个步骤必须要等到前面的步骤都跑完了,后面的步骤才会执行,而转换会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录一条记录的流向最后控件。
4.kettle的组成
- **勺子(Spoon.bat/spoon.sh) 😗*是-个图形化的界面,可以让我们用图形化的方式开发转换和作业。windows选择.bat; Linux选择.sh。
- 煎锅(Pan.bat/pan.sh) : 利用Pan可以用命令行的形式调用Trans。
- 厨房(Kitchen batkitchen.sh) : 利用Kitchen可以使用命令行调用Job
- 菜单(Carte.bat/ Carte.sh): Carte是一 个轻量级的Web容器,用于建立专用、远程的ETL Server。
5.kettle核心概念
5.1.可视化编程
- kettle可以被归类为可视化编程语言,因为kettle可以使用图形化的方式定义复杂的ETL程序和工作流
- kettle里的代码就是转换和作业
5.2.转换
- 转换负责数据的输入、转换、校验和输出的工作.
- kettle中使用转换完成数据ETL全部工作.
- 转换由多个步骤组成.
- 各个步骤使用跳(Hop)来链接,跳定义了一个数据流通道,即数据由一个步骤流(跳)向下一个步骤,在kettle中数据的最小单元是数据行,数据流中流动其实是缓存的行集(RowSet).
5.3步骤
步骤(控件)是转换里的基本的组成部分.
- 步骤需要有一个名字,这个名字在同一个转换范围内唯一.
- 每个步骤都会读、写数据行(唯一例外是生成记录步骤,该步骤只写数据).
- 步骤将数据写到与之相连的一个或多个输出跳(Hop),再传送到跳的另外一端的步骤.
- 大多数的步骤都可以有多个输出跳.一个步骤的数据发送可以被设置为分发和复制.分发是目标步骤轮流接收记录,复制是所有的记录被同时发送到所有的目标步骤.
5.4.跳(Hop)
跳就是步骤之间带箭头的连线,跳定义了步骤之间的数据通道
跳实际上是两个步骤之间的被称为行集的数据行缓存,行集的大小可以在转换的设置里定义.当行集满了,向行集写数据的步骤将停止写入,直到行集里又有了空间.当行集空了,从行集读取数据的步骤停止读取,直到行集又有可读的数据行.
![image-20231018212454505](https://i-blog.csdnimg.cn/blog_migrate/44ca4a26a44f79d298726d13dedbd833.png)
5.5.元数据
每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据.
- 名称:数据行里的字段名是唯一的.
- 数据类型:字段的数据类型.
- 格式:数据显示的方式.
- 长度:字符串的长度或者BigNumber类型的长度.
- 精度:BigNumber数据类型的十进制精度
- 货币符号:¥
- 小数点符号:十进制数据的小数点格式.
- 分组符号:数值类型数据的分组符号,
![image-20231019105001047](https://i-blog.csdnimg.cn/blog_migrate/11818dd99c81614c93c91e119ddcb5dd.png)
5.6数据类型
数据以数据行的形式沿着步骤移动.一个数据行是零到多个字段的集合.字段包含下面几种数据类型.
- String:字符类型数据
- Number:双精度浮点数
- Integer:带符号长整形(64位)
- BigNumber:任意精度数据
- Date:带毫秒精度的日期时间值.
- Boolean:取值为true和false的布尔值.
- Binary:二进制字段可以包含图像、声音、视频以及其他类型的二进制数据.
5.7.并行
跳的这种基于行集缓存的规则允许每个步骤都是由一个独立的线程运行,这样并发程度最高.
5.8.作业(Job)
负责定义一个完成整个工作流的控制,比如转换的结果发送邮件给相关人员.因为转换以并行方式执行,所以必须存在一个串行的调度工具来执行转换.这就是kettle中的作业.
6.kettle的组建
6.1.kettle输入控件
输入是转换里面的第一分类,输入控件也是转换中的第一大控件,用来抽取数据或者生成数据.输入是ETL里面的E,主要做数据抽取的工作.
6.1.1.CSV文件输入
6.1.2.文本输入
6.1.3.Excel输入
6.1.4.Xml输入
6.1.5.JSON输入
6.1.6.Data Grid
Data Grid组件允许用户以网格形式输入静态的数据行,这主要是为了测试、参考或演示目的.这些数据行可以来自多种来源,例如数据库表或文本文件。在创建复杂的转换流程时,Data Grid组件提供了一种直观的方式来设置和调整参数。此外,它还支持各种操作,如添加、删除和编辑数据行,以满足不同的数据处理需求。
![image-20231022162427839](https://i-blog.csdnimg.cn/blog_migrate/e88c64586bcf21c91552591f667ccba4.png)
6.2.kettle输出控件
![image-20231022120546436](https://i-blog.csdnimg.cn/blog_migrate/d8ae6085bb0af732d4bd7517822b23cb.png)
6.2.1.Excel输出
6.2.2.文本文件输出
6.2.3.SQL文件输出
![image-20231022114951421](https://i-blog.csdnimg.cn/blog_migrate/d023f1b3ed74bafc74365d4448a38be4.png)
6.2.4.表输出
-
更新(需要更新emp1表,必须保证两张表的数据行数相同,根据id作比较进行更新)
-
插入/更新(需要更新emp1表,两张表的数据行数可以不相同,更新字段添加id,把Y改成N)
![image-20231022115502666](https://i-blog.csdnimg.cn/blog_migrate/478ad8e63763961c611f06188421dcd6.png)
6.3.转换控件
6.3.1.Concat filelds
name就是拼接后新增的字段,下面获取得两个字段就是需要拼接的字段
![image-20231022120746116](https://i-blog.csdnimg.cn/blog_migrate/cd462ca0d191af44996fc15250cb6a84.png)
6.3.2.值映射
![image-20231022121327390](https://i-blog.csdnimg.cn/blog_migrate/fbeaa1c021a246bfa8828baddc257058.png)
6.3.3添加常量&增加序列
![image-20231022121424603](https://i-blog.csdnimg.cn/blog_migrate/dad2bb85e5883051e4eae4ced8e9d119.png)
字段选择是从数据流中选择字段,改变名称,修改数据类型
选择和修改:可以随意修改字段名称,长度
移除:只保留想要删除的字段
元数据:随意修改数据类型等
6.3.4.计算器
![image-20231022122843245](https://i-blog.csdnimg.cn/blog_migrate/1fdc040a797cc7cb426a8aa962c0a571.png)
6.3.5.字符串剪切&替换&操作
![image-20231022124135373](https://i-blog.csdnimg.cn/blog_migrate/237beb5323954f699a56637bac31b179.png)
6.3.6.排序记录
用于表连接时只保留重复的记录字段,意思是根据这个字段进行排序或连接,类似于两表之间得关联字段id
类似于根据id主键进行升序降序
6.3.7.拆分字段
注意:根据空格拆分,拆分字段之后源字段name就失效了,取而代之得是firstname,lastname
6.3.8.拆分为多行
6.3.9.行扁平化
把同一组数据得多行数据合并为一行,理解为:拆分多行得逆向操作
【注意】使用之前需要对数据进行排序
每个分组的数据条数要保证一致,否则会有错乱
![image-20231022151201327](https://i-blog.csdnimg.cn/blog_migrate/0836f26662f84dfc0885942b1c862fbd.png)
注意:拆分出来3列了,如果想要把3列合并为一列,需要使用Conncat filelds拼接控件
6.3.10.列转行
![image-20231022151529382](https://i-blog.csdnimg.cn/blog_migrate/a3afa16e59d8982b3d8af6f7eb13ea53.png)
- 关键字段:从数据内容变成列名的字段
- 分组字段:列转行,转变以后的分组字段
- 目标字段:增加的列的列名字段
- 数据字段:目标字段的数据字段
- 关键值字段:数据字段查询时的关键字段,也可以理解为key; 相当于源数据字段的值
![image-20231022151425225](https://i-blog.csdnimg.cn/blog_migrate/f70b77ec7c32ca15cef68d95a2be9181.png)
注意】列转行之前数据流必须按照分组字段进行排序,否则数据会错乱
6.3.11.行转列
![image-20231022151657552](https://i-blog.csdnimg.cn/blog_migrate/0554381f2b1e2458041bc285275eeafc.png)
- Key字段:行转列,生成的列名字段
- 字段名称:原本数据流中的字段名
- Key值:Key字段的值,跟前面的字段名称一样
- Value字段:对应的Key值的数据列的列名
![image-20231022151633318](https://i-blog.csdnimg.cn/blog_migrate/e979ab10f22c13d2e909f5cf1cc48921.png)
6.4.应用控件
6.4.1.替换null值
![image-20231022152117796](https://i-blog.csdnimg.cn/blog_migrate/725f27b6db8f5e757d689ecfec75a328.png)
![image-20231022152139532](https://i-blog.csdnimg.cn/blog_migrate/ac5b0d6f59b3fde28a081bf1a09ddf6d.png)
6.4.2.写日志
调试的时候使用,可以将数据流的每行数据打印到控制台,方便我们调试整个程序
1.选择日志级别
2.可以输入自定义输出的语句
3.选择要输出打印的字段
![image-20231022152321889](https://i-blog.csdnimg.cn/blog_migrate/3f132727930b659e308d1bdbc9500e45.png)
6.5.流程控件
6.5.1.Switch/case
6.5.2.过滤记录
过滤记录和Switch/case做对比的话,过滤记录相当于if-else,可以自定义输入一个判断条件,然后将数据流中的数据一路分为两路。
![image-20231022153114177](https://i-blog.csdnimg.cn/blog_migrate/170939de5071ee05e0bfeecb14f94012.png)
6.5.3.空操作
空操作,什么也不做,此控件一般作为数据流的终点
![image-20231022153209710](https://i-blog.csdnimg.cn/blog_migrate/e83ad58be68b5351f67da2c73c9b75ee.png)
6.5.4.中止
中止是数据流的终点,如果有数据流到此处,整个转换程序将中止,并且在控制台输出报错信息。此控件一般用来校验数据或者调试程序。
![image-20231022153332283](https://i-blog.csdnimg.cn/blog_migrate/1394b54d8032e4a37bf7e4918c935e10.png)
![image-20231022153405016](https://i-blog.csdnimg.cn/blog_migrate/42461085b1b6fcebcd3c2c3d74b5806d.png)
6.5.5.Transformation Executor(转换执行器)
主要功能是执行子转换。当子转换需要配合使用的时候,例如从结果获取记录和复制记录到结果这两个步骤,Transformation Executor就会被调用。同时,它还可以用于实现ETL操作中的循环调用,通过设置Transformation的高级属性(“执行每一个输入行”)来实现。
需要注意的是,作业和转换是Kettle中的两种主要控件类型。作业是步骤流,每一个步骤必须等到前面的步骤都跑完,后面的步骤才会执行;而转换则是数据流,会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录、一条记录地流向最后的控件。因此,Transformation Executor的使用对于实现ETL过程中的数据流处理至关重要.
6.6.查询控件
6.6.1.数据库查询
一般用于左连接,表输入是左表
![image-20231022153558217](https://i-blog.csdnimg.cn/blog_migrate/3b3d24d2d9ff4c717306c2b38cdb6aa8.png)
6.6.2.流查询
![image-20231022153657996](https://i-blog.csdnimg.cn/blog_migrate/85086e993823b86ce51b0cacf2efbf44.png)
![image-20231022153732184](https://i-blog.csdnimg.cn/blog_migrate/cc7350a69828ce160735f37563123bf7.png)
6.7.连接控件
6.7.1.合并记录
用于将两个不同来源的数据合并,这两个来源数据分别为旧数据和新数据,将旧数据和新数据按照指定的关键字匹配,比较,合并。
6.7.2.记录集连接
对两个步骤中的数据进行左连接,右连接,内连接,外连接;使用此控件之前需要对记录集的数据进行排序,排序的字段一定是两个表关联的字段,否则数据错乱,出现null值
6.8.统计控件
6.8.1.分组
类似于group by,按照一个或几个分组之后其余字段可以按照聚合函数进行合并计算
注意:在进行分组之前,数据最好先进行排序(按照分组的字段排序)
![image-20231022154245111](https://i-blog.csdnimg.cn/blog_migrate/7438edc907ce952cd59d44ac958f9b52.png)
6.9.映射控件
6.9.1.映射
![image-20231022154421520](https://i-blog.csdnimg.cn/blog_migrate/5014312e5d814f7108c461cb1e4e6894.png)
6.10.脚本控件(scripting).
6.10.1.执行SQL脚本
![image-20231022154527726](https://i-blog.csdnimg.cn/blog_migrate/571cb811b9eb7dfb0ce1ff3b4b10b947.png)
6.10.2.用户定义的java类
6.11.Tranform(转换控件)
6.11.1.Select/Rename values
对input的值进行筛选,重命名等操作
![image-20231022160424636](https://i-blog.csdnimg.cn/blog_migrate/1f034fb34423945d2d5417e34b9cfdb1.png)
6.11.2.增加常量(Add constants)
主要是添加常量到流中
![image-20231022161959256](https://i-blog.csdnimg.cn/blog_migrate/e6bcf871de675e32086b9ae54e4cb8b2.png)
6.12.Job(任务)
6.12.1.Get rows form result
获取上游步骤生成的结果集数据。这些数据可以来自不同的源头,例如数据库查询、文本文件等。你可以指定要获取的元数据字段。需要注意的是,这个组件一次只能获取一组记录,而不能获取单个记录。如果需要对结果集中的每一行数据进行操作,可以使用循环或者复制多行到结果步骤。此外,根据获取的数据,可以通过设置变量的方式来实现数据的传递和处理。
![image-20231022163314648](https://i-blog.csdnimg.cn/blog_migrate/a27103bddda9ecc16887ac9ecfe17ff4.png)
6.13.普通组建
6.13.1.start(开始组建)
,Start组件的主要功能是设置作业的执行方式和时间。它可以配置作业为手动执行或定时执行。当设置为定时执行时,可以指定作业的执行频率,例如每天、每周或每月执行一次。此外,Start组件还可以设置作业并行执行的数量,以及选择作业中各个步骤的执行顺序。
这种定时执行任务的功能在实际工作中非常有用,尤其是在需要定期获取、处理数据的情况下。例如,你可以设置每天晚上12点自动从数据库中抽取新的销售数据,然后对这些数据进行清洗和转换,以便第二天早上进行分析。这样不仅可以节省人力资源,也可以确保数据的及时性和准确性。
![image-20231022164233302](https://i-blog.csdnimg.cn/blog_migrate/6cdb1d5ab743fedea30965baad0473a7.png)