目录

前言 

一、kettle是什么

二、kettle 安装与基本使用

2.1 kettle 安装

2.2 kettle的基础使用


   文章定位是能够为初学者提供一个快速入门参考,同时记录了我在工作使用kettle的经验和总结文章内容持续更新,希望能够给大家提供一些帮助,同时也欢迎大家一体探索kettle的各种奇技淫巧~~~。另外我在kettle的使用过程中经常会参考kettle中文网,我在这个网站学习到很多有用的知识

        Kettle是一款国外开源的ETL工具,纯java编写可以在Window、Linux、Unix上运行,绿色无需安装数据抽取高效稳定。kettle中文名称叫水壶。主要用作数据抽取,转换工作。

        前面提到 kettle是java编写,在安装之前需要先安装jdk环境建议jdk版本保持在1.8及以上。把kettle安装包解压放到指定文件夹目录下,进入 kettle-pdice-9.0.0.0-423dataintegration目录双击运行Spoon.bat脚本即可打开kettle开发页面

电脑弹出下图页面标识kettle已经开始启动

稍等片刻后,kettle程序启动完成,下图就是kettle的工作页面

至此,说明kettle已经可以正常使用了。

点击文件下的新建图片弹出下拉框选择转换功能,弹出转换编辑页面

 转换编辑页面

        通过点击tab标签切换对象树和核心对象树,在初学阶段主要关注核心对象树。可以通过点击模块左边箭头展开模块内容,也可以通过搜索输入组件名对组件进行模糊搜索

  1. 拖动组件图片右边工作窗口完成组件选择
  2. SHIFT+鼠标左边连接两个组件
  3.  点击保存按钮完成转换编辑 
  4.  点击启动按钮启动转换

 运行结果

组件图标为绿色对号表示正确运行 ,红色叉号代表允许出错

        当我们清除一个组件的用途时,可以鼠标放到组件上停留一到两秒,然后就会提示这个组件的用法。如下图

        如果不清楚某一个组件的用法可以尝试点击help按钮。从官网获取帮助,不幸的是官网时常不可用。

        转换侧重于数据流处理。它处理抽取,转换,加载阶段各种对数据行的操作。转换包括一个或者多个步骤step),如读取文件过滤输出行,数据清洗或者将数据加载数据库

1.作用

生成一些空记录或者相等的行

2.用法

拖动生成记录组件到编辑区,双击组件图标按照下图进行配置通过预览可以看到生成10条相同的数据

 3.用途:

用来与其他组件进行测试

1.作用

 从数据库读取数据

2.用法

1.双击表输入组件图标,弹出下图弹框

 2.点击新建按钮创建数据库连接(如果数据库链接存在可以直接使用),按照提示填写完成之后,点击测试按钮,弹出成功对话框表示数据库连接测试成功。

3.在SQL输入框中输入查询sql,点击预览按钮可以查看查询出来的数据 。

 3.用途:

数据库读取数据

4.注意事项

在数据预览过程中,如果数据量过大或者查询时间过长,容易造成kettle卡死甚至崩溃,在预览过程可以尝试sql后加分页查询语句

1.作用

 把数据写到数据库表中

2.用法:

        为了展示出数据插入效果我们结合表输入组件一起使用,把t_test表中的数据存入到t_test_1表中

1.选择数库连接

2.输入目标表名

3.点击指定数据库字段复选框

4.切换数据库字段

5.点击获取字段按钮检查左边字段与流字段的对应关系是否正确,如果不正确可以直接修改

6.运行转换。

 3.小技巧

        由于表t_test_1中的id字段是自增的,在插入数据库之前我们并不知道id的值是什么,幸运的是表输出组件提供了获取值的功能,但性能如何,我没有进行测试,大家用的时可以留意一下。使用方法如下

1.切换标签页到主选项

2.选择 <返回一个自增产生的关键字&gt;复选框

3.在 <自动产生的关键字字段名称&gt; 输入框输入一个字段名用来标识自增字段值

 预览数据:

1.作用

根据关键字更新或者插入记录到数据库表中

 2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中的数据更新或插入到t_test_1表中

1.双击<插入/更新&gt;组件

2.选择数库连接

3.输入目标表名

4.点击<用来查询的关键字&gt;右边获取字段按钮,清除需要的字段

5.点击<更新字段&gt; 右边获取和更新字段按钮,清除不需要的字段

6.运行转换。

3.注意事项 

        由于组件在更新每一条数据之前都会先到数据库查询一次数据,导致速度很慢,如果对数据处理速度有要求,尽量避免使用此组件。

1.作用

根据关键字把数据更新到数据库表中。

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中的数据更新到t_test_1表中

1.双击<更新&gt;组件

2.选择数库连接

3.输入目标表名

4.点击<用来查询的关键字&gt;右边的获取字段按钮,清除不需要的字段

5.点击<更新字段&gt; 右边的 获取和更新字段按钮,清除不需要的字段

6.运行转换。

        按照图中示例填写对应选项即可完成设置。其中<批量更新><跳过查询><忽略查询失效>复选框在选择后,由于减少了查询的步骤,所以在性能上一定的提升,具体细节还请小伙伴们自行探索

1.作用

字符串进行去除空格追加字符的操作。

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,加工t_test表中的name字段

1.双击<字符串操作>组件

2.编辑数据对话框

3.运行转换。

 3.注意事项

使用追加字符功能需要 Padding、Pad Char和Pad Length选项结合起来使用。

1.作用

根据条件替换字符串

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,加工t_test表中的name字段中包含 “张” 的字符串 替换 为 “小米

1.双击<字符串替换>组件

2.编辑数据对话

3.运行转换。

 3.注意事项

搜索条件也可以使用正则表达式进行搜索匹配,<整个单词匹配>被选中为 是 的时候,必须完全匹配条件才会成立。

1.作用

常用作选择或移除数据流中的字段,对字段重命名,还可以设置字段的类型长度精度

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,加工t_test表中的id字段类型修改小数。同时移除sex字段,修改name字段名name_new

1.双击<字段选择>组件

2.编辑数据对话

3.运行转换。

移除sex字段: 

格式化id重命名name字段:

运行结果预览:

1.作用

把一个字段的值设置到另一个字段中。目前我没有发现这个功能的实际用途。

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,加工t_test表中的sex 字段替换为 name字段值

1.双击<设置字段值>组件

2.编辑数据对话框

3.运行转换。

 1.作用:

        通过执行简单计算创建一个新的字段。我在数据库操作中常用来根据几个字段生成一个组合主键

2.用法:

        为了展示出组件的效果,我们结合表输入组件一起使用,根据t_test表中的name、sexage字段生成一个新的字段combine

1.双击<计算器>组件

2.编辑数据对话框

3.运行转换。

1.作用:

根据已经排序好的输入流去除重复的记录。

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,根据t_test表中的sex字段进行去除重复记录。

1.双击<去除重复记录>组件

2.编辑数据对话框

3.运行转换。

根据sex字段去重 

 点击确定弹出提示,要求我们在去重之前需要先根据去重字段排序

 3.注意事项

1.在使用去重组件时一定要先根据去重字段进行排序,组件不关心排序是否升序降序

2.如果需要根据多个字段进行去重,则数据流也必须先根据对应字段进行排序

3.如果数据量比较大,不建议使用kettle自带排序功能组件,因为这样会阻塞数据流,且排序速度不理想。

1.作用:

把一个字段的值映射为另一个值,常用来做字典翻译功能

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,根据t_test表中的sex字段进行字典翻译

1.双击<值映射>组件

2.编辑数据对话框

3.运行转换。

1.作用:

给一个为NULL的字段值设置一个默认值。在实际使用过程中尝尝用来给数据填充默认值

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,根据t_test表中的sex字段进行设置默认值。

1.双击<替换NULL值>组件

2.编辑数据对话框

3.运行转换。

 3.注意事项

<替换所有字段的null值>、<值类型>、<字段>三个输入框同时只能有一个生效通过选择蓝色线框的复选框来确定哪个输入框生效

3.4.2 写日志

1.作用:

信息写到日志中。在调试中经常会用到这个功能组件。

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中的字段写入到日志中。

1.双击<写日志>组件

2.编辑数据对话框

3.运行转换。

在转换中同样可以调用转换或者job,但目前用还没用到,等用到之后,再来详细记录。

1.作用:

java脚本就是使用java语言通过代码编程来完成对数据流的操作。内置了很多函数可以直接使用。

2.用法:

为了展示出组件的效果,我们结合表输入组件一起使用。

1.双击 <java 代码组件> 打开功能对话框。可以看到代码编辑区展示空白

 2.点击 Code Snippites 左边箭头展开下一级,看到二级分类菜单打开Common use 如下

3.双击Mai图标 将在右侧出现代码片段,我们主要在processRow(…)方法中编辑代码逻辑

 4.常用方法介绍

4.1 main方法

/*
main 方法对应processRow(..)方法。
主要用来处理行数据,如对数据进行加工或添加字段
另外,我们也可以在方法外部定义变量。
*/

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;

    /* TODO: Your code here. (Using info fields)

    FieldHelper infoField = get(Fields.Info, "info_field_name");

    RowSet infoStream = findInfoRowSet("info_stream_tag");

    Object[] infoRow = null;

    int infoRowCount = 0;

    // Read all rows from info step before calling getRow() method, which returns first row from any
    // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
    while((infoRow = getRowFrom(infoStream)) != null){

      // do something with info data
      infoRowCount++;
    }
    */
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

  // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
  // enough to handle any new fields you are creating in this step.
  r = createOutputRow(r, data.outputRowMeta.size());

  /* TODO: Your code here. (See Sample)

  // 从流中获取字段对应的值,如果字段名存在,会抛出异常
  String foobar = get(Fields.In, "a_fieldname").getString(r);

  foobar += "bar";
    
  // 把数据设置到对应字段中,如果output_fieldname字段不存在,则可以在代码编辑区的下方字段设置框中设置字段信息。详情看下图:
  get(Fields.Out, "output_fieldname").setValue(r, foobar);

  */
  // Send the row on to the next step.
  putRow(data.outputRowMeta, r);

  return true;
}

 设置输出字段信息

 4.2 Implement init

/*
组件被启动时,执行一次,常用来初始化一些资源数据
*/
public boolean init(StepMetaInterface stepMetaInterface, StepDataInterface stepDataInterface) {
  return parent.initImpl(stepMetaInterface, stepDataInterface);
}

4.3 Implement dispose

/*
流结束时,被调用一次,常用来销毁资源,或做一些后置处理通知消息等操作
*/
public void dispose(StepMetaInterface smi, StepDataInterface sdi) {
  parent.disposeImpl(smi, sdi);
}

4.4 getVariable

// 用来获取环境变量的值
String getVariable = getVariable(variableName, defaultValue);

3.小技巧

1. 在脚本中还可以通过 Step logging 中的方法来设置日志,方便调试

2.可以通过左边 Input files / Output files 快速生成 获取流中的字段值或设置流中的字段值 的相关代码,详情看下图。

设置字段值快捷方式

1.作用:

根据关键字段连接连个流数据。类似于数据库中的连接操作(INNER JOIN ,LEFT OUT JOIN ,RIGHT OUT JOIN ,FULL OUT JOIN )

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中数据与t_test_2表中的数据进行关联

1.双击<记录集连接>组件

2.编辑数据对话框

3.运行转换。

 弹出对话框提示我们需要把连接字段进行排序

 3.注意事项

1.在使用连接组件前连个数据源一定要先根据相同的规则排序,如果存在多个连接字段,要对多个字段同时排序。

1. 作用:

根据已经排序的字段合并两个数据流,并标识出结果集中的数据的状态new(新建deleted(删除) changed(改变) identical(相等)。

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中数据与t_test_1表中的数据(id,name,age)进行合并

1.双击<合并记录>组件

2.编辑数据对话框

3.运行转换。

输入数据:

 输出结果:

1.作用:

根据已经排序的分组字段,对结果进行聚合。相当于SQL 语句中的 SELECT 聚合函数() FORM TABLE GROUP BY FIELD ;

2.用法:

       为了展示出组件的效果,我们结合表输入组件一起使用,把t_test表中的数据根据sex字段进行分组,并对组内数据中的age字段进行求和,对组内数据中的name字段进行逗号拼接

1.双击<聚合>组件

2.编辑数据对话框

3.运行转换。

 分组前需要先根据分组字段排序

 3.注意事项

 使用分组功能前一定要对数据进行排序。如果存在多个分组字段,则对应的字段都应该被排序。

1.作用:

变量设置到指定环境变量中。常与脚本组合使用,来生成动态变量

2.用法:

       为了展示出组件的效果,我们结合生成记录组件,java代码组件一起使用。我们打算把字段:test_variable  值:test_value 设置为变量。

2.1 设置生成记录组件。只有当有数据流入组件时,组件才会工作。所以我们需要创建一条记录来启动java代码组件。

2. 2 设置java代码组件。

2.3 设置变量

出框出现提示语:

我们设置的变量,现在还不能直接使用,如果想使用我们设置的变量,可以先在任务第一个转换里设置变量。 

 3.注意事项

如果我们在生成记录组件中 设置生成两条数据,则设置变量组件会报错错误信息如下

1.作用:

有些场景需要在组件中使用参数,此时可以通过占位符获取数据

2.用法:

 通过${key}的方式获取变量。使用示例如下

 在转换调试过程中可以先设置sex_variable的默认值。双击空白处,弹出如下编辑框,在命名参数tab页可以设置命名参数默认值。

 也可以在数据库配置输入框中使用占位符

1.作用:

调试过程中有可能需要查看组件的输入与输出数据类型遇到这种场景可以通过显示输入/输出字段功能查看

2.用法:

鼠标选择组件,点击右键弹出选择框:

输入字段详细信息:

 输出字段详细信息:

1.作用:

数据是以什么方式流向下一个组件。目前仅支持轮询复制发送两种发送方式

2.用法: 

1.作用:

控制启动组件的组件的个数,常用于表输出组件,提高输出效率

2.用法:

1.作用:

控制数据的流向。

2.用法:

鼠标放置到连线上右键弹出选项框。选项框提供了连接线的常用功能。如果选择<使节点连接失效>则连接线会变灰,同时数据不会流向下一个组件。需要注意的是单击接线也会使结点失效生效之间转换,在使用时需要注意误操作。

         任务(作业)侧重于对步骤编排作业按照一定的顺序完成,因为转换以并行方式执行的,就需要一个可以串行执行的作业处理系列按照顺序完成的操作。一个作业包括一个或者多个作业项,这些作业项以某种顺序来执行。作业执行顺序由作业项之间的跳(job hop)和每个作业项的执行结构来决定。

1.作用:

表示一个任务的开始,提供了定时调度能力。

2.用法:

1.拖动 start 图标到编辑区。

2.双击Start图标,设置开始组件。

 3.注意点:

虽然kettle的start组件提供了定时调度功能,但是功能比较弱,kettle官方也不推荐使用自带调度功能,反而建议使用操作系统自带定时任务。

1.作用:

调用一个已经存在的转换。

2.用法:

1.拖动 转换 图标到编辑区。

2.双击 转换 图标。

选择转换文件: 

选择转换文件

 3.需要注意的是,现在的任务还不能直接看到效果。如果需要使组件运行,需要通过连接线进行连接。运行后,组件右上角展示的绿色对号表示正确运行结束

1.作用:

调用一个已经存在的任务。

2.用法:

用法与转换组件相似这里就不重复介绍了。

文件中获取变量,常用来读取配置文件

2.用法:

1.拖动 设置变量 图标到编辑区。

2.双击 设置变量 图标。

 3.注意事项:

1.在这里设置的变量,可以通过组件中的占位符(${})获取,也可以在java代码中通过String getVariable = getVariable(variableName, defaultValue)方法获取。

2.设置时注意变量的有效范围

3.配置文件文本格式应该设置为 UTF-8 格式

4.小技巧

鼠标放置到 <S>处 ,可以看到提示信息,根据提示信息可以查看系统内置的变量。

1.作用:

没有实际用处,仅仅表示任务执行到了 成功 节点。可以存在多个 成功 节点

1.作用:

用于执行一个sql脚本。

 2.用法:

1.拖动  SQL 图标到编辑区。

2.双击 SQL 图标。

1.作用:

1.等待一个文件,常用来做任务是否完成的标志。当某一个任务完成后,可以创建一个标志文件,当其他任务检测到该文件时,就会知道某一个任务已经完成。

2.用法:

1.拖动 等待文件 图标到编辑区。

2.双击 等待文件 图标。

1.作用:

决定下一个数据的流向,确定数据流入下一个组件的条件或者是否流向下一个组件。

2.用法:

任务中的连接线与转换中的连接线类似。但多了<评价>选项评价功能用来决定当上一个组件执行完后是否执行下一个组件(每一个组件执行完后都有一个是否执行成功的标识true/false)。

1.作用:

使下游的组件以并行的方式运行。常用来运行多个互不影响的任务。

选中一个组件右键选择 Run Next Entiries in Parallel (以并行的方式处理下一个节点即可

设置完成后连接线变为虚线且有等于号: 

3.注意事项:

当设置并行时,会出现下面提示框

 翻译结果如下

        当前并行执行作业项的实现根本不执行任何并发检查。至少可以考虑使用文件锁定或任何其他基本高级系统自己执行。
还请注意,因为作业是通过回溯执行的,所以不仅下一个作业条目是并行启动的,而且后续的作业条目也是并行启动的。
请不要再显示警告

 针对翻译个人理解

1.并行的节点之间没有并发安全性设计。如果涉及到各个节点之间安全性,需要自己实现。

2.并发节点之后的所有节点都是并发的,这就意味着如果分支之间再去合并,合并后的节点依然是并发的。

以上就是kettle任务的使用入门。如有疑问欢迎留言

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注