一、Kettle介绍
Kettle 是一个开源的 ETL(Extract, Transform, Load,提取、转换、加载)工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment,广泛应用于数据集成、数据清洗、数据迁移等领域。它的名字“Kettle”源自其“装置”功能的含义,即“把各种数据源像水一样提取出来并进行处理”。在2006年被Pentaho公式收购后,重命名为 Pentaho Data Integration(PDI),这个工具能够帮助用户在不同的数据源和目标系统之间进行数据转换、清洗和加载。Kettle 被广泛用于构建数据仓库、数据集成平台等。
二、转换(Transformation)转换是Kettle中的核心组件之一,负责定义数据从源到目标的转换过程。转换由多个步骤(Step)组成,每个步骤都有特定的功能,如数据抽取、数据清洗、数据转换等。这些步骤通过跳(Hop)来连接,形成一个完整的数据转换流程。跳定义了一个单向通道,允许数据从一个步骤流动到另一个步骤。
步骤(Step):步骤是转换中的基本组成部分,每个步骤都会读、写数据行(唯一例外是“生成记录”步骤,该步骤只写数据)。步骤将数据写到与之相连的一个或多个输出跳,再传送到跳的另一端的步骤。大多数步骤都可以有多个输出跳,且一个步骤的数据发送可以被设置为分发和复制。
分发是目标步骤轮流接收记录
复制是所有的记录被同时发送到所有的目标步骤
跳(Hop):跳是步骤之间带箭头的连线,定义了步骤之间的数据通路。跳实际上是两个步骤之间的被称之为行集的数据行缓存。当行集满了,向行集写数据的步骤将停止写入;当行集空了,从行集读取数据的步骤停止读取。
三、转换控件详解 1、输入控件输入是转换里面的第一个分类, 输入控件也是转换中的第一大控件, 用来抽取数据或者生成数据。输入是ETL里面的E (Extract),主要做数据提取的工作,本文挑选其中的主流输入控件进行介绍。
CSV文件是一种文本文件,其中数据的每个部分都由逗号分隔。这种格式使得数据能够以简单的文本形式存储,同时保持表格数据的结构。
步骤名称:自定义步骤名称,确保在同一个转换内命名唯一
文件名:点击浏览选择对应的CSV文件
列分隔符:默认是CSV的分隔符逗号
封闭符:结束行数据的读写(不用改)
NIO 缓存大小:文件如果行数过多,需要调整此参数
包含列头行:意思是文件中第一行是字段名称行,表头不进行读写
行号字段:如果文件第一行不是字段名称或者需要从某行开始读写,可在此输入行号。
并发运行? :选择并发,可提高读写速度
字段中有回车换行? :不要选择,会将换行符做数据读出
文件编码:如果预览数据的名称出现乱码,可更换文件编码为UTF-8
1.2 XML文件输入XML(eXtensible Markup Language,可扩展标记语言)是一种标记语言,它被设计用来传输和存储数据。与HTML(HyperText Markup Language,超文本标记语言)主要用于显示数据不同,XML更侧重于数据本身的结构和内容。
1、点击浏览选择XML文件
2、点击增加后,添加到选中的文件和目录列表中
3、点击获取XML文档的所有路径后选择循环读取路径
4、点击获取字段
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。XPath使用路径表达式在XML文档中选取节点。下面列出了最有用的路径表达式
XPath表达式说明与用法示例JSON(JavaScript Object Notation)文件是一种轻量级的数据交换格式文件,它基于ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。
1、点击浏览选择JSON文件
2、点击增加后,添加到选中的文件和目录列表中
3、使用JSON Path或者点击Select fields,获取到需要的字段,并且设置合适格式
4、针对数据嵌套情况,新增一个json输入步骤用于解析
在这里插入图片描述
JSON Path是一种查询JSON对象的语言,它允许用户通过一种简洁明了的语法来定位和提取JSON对象中的特定数据。这种语言类似于XML中的XPath,但专门为JSON数据格式设计。
表达式示例 JSON用法说明1、根据表格类型选择引擎(xls或者xlsx)
2、点击浏览选择Excel文件
3、点击增加后,添加到选中的文件列表中
4、获取工作表并添加
5、选择字段并预览
1、点击浏览选择Excel文件
2、点击增加后,添加到选中的文件列表中
3、选择分隔符,编码方式
4、点击获取字段并预览
表输入是Kettle中极为常用的一种输入组件,鉴于企业数据多存储于数据库中,这一功能显得尤为重要。Kettle支持连接多种主流数据库,如Oracle、MySQL、SQL Server等。然而,在建立与这些数据库的连接之前,配置相应的数据库驱动是不可或缺的步骤。接下来,我们将以MySQL为例,详细阐述Kettle如何连接MySQL数据库。
1、下载mysql连接jar包放入安装目录下的lib目录中
MySQL :: Download MySQL Connector/J (Archived Versions)
1、在DB连接中配置数据源,右键点击共享后其他转换也能使用该数据源
2、预览
“输出”在数据转换中扮演着至关重要的角色,它既是转换流程中的一个关键分类,也是实现数据加载(Load)的核心环节。而“输出控件”则是确保这一流程顺利进行的重要工具,它负责数据的存储和管理。
Kettle中自带了两个Excel输出,一个Excel输出,另一个是Microsoft Excel输出。Excel输出只能输出xls文件(适合Excel2003),Microsoft Excel输出可以输出xls和xlsx文件(适合Excel2007及以后)
1、配置文件名和扩展名
2、按需配置内容和格式(一般不调整)
3、获取字段
1、配置输出的文件名和扩展名
1、选择目标表,或者自定义目标表
2、自定义目标表时,可以点击SQL,点击执行创建目标表
3、可以看到数据已输出到test_table表
更新操作涉及将数据库表中的数据与数据流中的数据进行比对。如果发现两者之间存在差异,则进行更新。然而,如果数据流中的数据量超出了数据库表中的数据量,系统则会报错。
1、现在ywl表和test_table表里的数据量一致,我修改几条test_table表的数据
2、更新test_table表中数据,查询值选择时间(一般为唯一主键)
3、执行后test_table表数据重新和ywl表数据保持一致
4、特殊情况,用来查询的关键字对应的test_table表中数据有多条时,虽然两表数据量不一致,但是不会报错,test_table表中数据全部更新
执行前
执行后
4、这时候删除一条test_table表中数据再执行,这时候会报错,因为更新要求两表数据量一致
那有什么办法可以做到缺失的时候插入,其他时候更新呢,这时候就可以使用插入 / 更新步骤。
执行后发现test_table表被删除的数据又插入了。
2.6 删除这个控件允许用户根据特定条件从数据库表中移除数据。
在test_table中新增两条ywl中不存在的数据
执行后test_table中数据除了新增的两条ywl中不存在的记录外,全部被删除
ETL中的Transform阶段是一个至关重要的环节,它负责将Extract阶段从源系统中提取出来的数据进行清洗、转换和处理,以满足目标数据存储系统的要求,是ETL过程中最为复杂和耗时的部分之一。
在本身的数据流里面添加一列数据,该列的数据都是相同的值。
给表employee_employee的数据加一列固定值HeatSubsidy
可以看到已添加
增加序列是给数据流添加一个序列字段,可以自定义该序列字段的递增步长。
将两个或多个字段(或变量)的值连接在一起形成一个新的字符串。
Target Field Name:拼接后的字段名
Separator:拼接符
Fields:要拼接的字段
可以看到已拼接
值映射(Value Mapping)是一种数据转换技术,它用于将数据字段中的特定值转换为其他预定义的值。在数据质量管理和数据整合的场景中,值映射尤为重要,因为不同系统或数据源可能使用不同的编码或表示法来表示相同的概念。
使用的字段名:需要映射的字段
字段值:从源值映射为目标值
可以看到已映射
列拆分为多行就是把指定字段按指定分隔符拆分为多行
可以看到habby已拆分
行扁平化就是把同一组的多行数据合并成为一行,可以理解为列拆分为多行的逆向操作。
1、目标字段的数量等于hobby的类型数量
将原始数据表格中的列数据转换为行数据,这种操作常用于将多个列的值合并为一列,并添加新的列名来标识原始列名。
1、配置关键字段、分组字段、目标字段
2、转换完成
行转列是指将数据库或数据表格中的行数据转换为列数据。这种操作通常用于数据的汇总、报表制作或数据透视。
1、配置Key字段、字段
2、转换完成
可以通过计算器里面的多个计算函数对已有字段进行计算,得出新字段。
已转换
唯一行(哈希值)就是删除数据流重复的行,给每一行的数据建立哈希值,通过哈希值来比较数据是否重复,唯一行(哈希值)去重效率比排序记录+去除重复记录高。
1、输入数据
2、转换后重复数据已删除
1、输入数据
2、转换后数据
1、输入数据
2、转换后数据
Trim type:去除左右两端空格
Lower/Upper:大小写
Padding:填充
Pad cahr:填充的字符
Pad Length:填充的长度
InitCap:首字母转换为大写,其余字母转换为小写
Escape:转义字符处理,如Use CDATA可以将字符串转换为CDATA格式的字符串
Digits:数字处理,none:不进行数字处理,only:只保留数字字符,去除其他字符,remove:去除数字字符,保留其他字符。
Remove Special Character:去除特殊字符,可以根据需求选择需要删除的字符,如空格(space)、换行符(line feed)等
1、输入数据
2、输出数据
4、应用控件缺失值处理
1、输入数据
2、输出数据
1、自定义常量数据配置
2、发送邮件配置
3、执行后,已收到邮件
日志控件可以将数据流的每行数据打印到控制台。
1、配置打印的内容
2、执行后日志已打印
Switch/case可以利用某一个字段的值的不同,让数据流向不同的步骤。
1、配置Switch / case
3、可以看到数据已分流
1、配置过滤字段和过滤条件
2、可以看到数据数据已分流
在转换过程中,有时需要处理异常情况或手动中止流程。这时,中止控件(Stop Control)就显得尤为重要。
Abort the running transformation:这个选项会立即停止整个转换的执行。所有正在进行的步骤都会被中止,不管它们是否已经完成当前的数据处理。
Abort and log as an error:这个选项不仅会立即停止整个转换的执行,还会将中止原因记录为错误日志。这对于调试和后续分析错误原因非常有帮助。
Stop input processing:这个选项的作用是停止当前步骤(Step)的输入数据处理。当选择这个选项时,转换不会立即停止,而是会停止当前步骤接收和处理新的输入数据。已经处理的数据不会受到影响,后续步骤仍然会继续处理它们。
5.4 空操作(什么也不做)空操作是一个特殊的步骤(Step),它实际上不会对数据流执行任何操作。这个控件的主要作用是作为数据流的终点或占位符,在特定的转换逻辑中可能需要一个不执行任何动作的步骤。
1、配置sql,Alice的工资+300
执行每一行?: 勾选“执行每一行”后,就可以在UPDATE语句中使用?来代替变量名了。且“Bind parmaters”变为可用
Execute as a single statement:(作为单条语句执行)是一个在执行SQL脚本组件中的选项。这个选项决定了SQL脚本是应该被当作一个整体发送到数据库执行,还是应该按照分号(;)分隔成多个单独的语句来执行。
Quotes String: 该选项与“Bind parmaters”选项只能选一个,勾选该选项的作用是,在替换的变量前后两端加上单引号,并且对于特殊字符进行转义,比如条件值中,有单引号时,kettle会自动在单引号前再加一个单引号(在两端单引号的基础上)
Bind parmaters: 勾选时字段为字符类型时,问号两端不能加单引号
UPDATE test_orm.employee_employee SET salary=salary WHERE name =?
不勾选时需要在问号两端加单引号,如果是数值类型,则不需要
UPDATE test_orm.employee_employee SET salary=salary WHERE name =‘’?’
变量替换: 勾选后where条件可以使用动态参数替换
用法1:如果仅仅勾选“变量替换”,则sql语句中,只能使用变量来替换,而不能用传的参数,即只能用${V_TABLE_NAME},而且,如果字段为字符型,还必须加单引号,即UPDATE语句需要写成如下:
UPDATE test_orm.employee_employee SET salary=salary WHERE name =‘${name}’
用法2:先勾选了“执行每一行”,然后编辑左下角的参数,此时可以从上一个步骤的数据流中或者数据作为条件:
UPDATE test_orm.employee_employee SET salary=salary WHERE name =?
2、执行转换后sql已执行
读取字段中的sql脚本并执行
1、输入表的s字段中存放了insertsql
2、配置读取s字段
3、执行后可以看到成功执行了insert语句
用于确认输入的表名和列名是否存在
1、配置测试数据
2、输出结果,与实际情况一致,3个字段存在
数据库查询控件可以从数据库里面查询出数据,然后跟数据流中的数据进行左连接。
1、配置Database lookup
2、执行后输出left join后的数据
1、配置测试数据
2、执行结果与实际一致,表存在
流查询控件可以将两条数据流中的数据加载到内存中,然后按照指定的字段做等值匹配后输出。
1、流查询配置
2、执行后结果
合并连接可以实现两个数据流的inner、left、right、full类型的join,注意输入的数据流需要事先排好序,并且排序的字段还一定要选两个表关联的字段,否则数据错乱,出现null值。
1、步骤配置
2、执行结果
合并上下数据流,等同于sql中的union,即合并去重,注意输入的数据流需要事先排好序,并且排序的字段还一定要选两个表关联的字段,否则数据错乱,出现null值。
1、步骤配置
2、执行结果,已合并
可以实现类似sql中的group by聚合功能
1、步骤配置
2、执行结果
功能等同于分组控件,在内存中进行