Kettle系列教程-第九章:脚本组件

Author Avatar
山小杰 7月 30, 2018
  • 在其它设备中阅读本文章

本系列教程基于Kettle 8.1(pdi-ce-8.1.0.0-365)。大部分内容同样适用于Kettle 7.x版本。
章节目录:

本章说明

本章主要介绍一下转换中的【Java代码】组件和作业中的【SQL】和【Shell】组件。

转换-Java代码组件

在制作ETL流程的过程中,很有可能会遇到Kettle内置的组件无法满足使用的情况,这个时候就可以利用【Java代码组件】来满足我们的特殊需求,相当于自定义插件。比如我们需要一个将中文字符串转为拼音的功能,很显然,Kettle没有这个功能,我们就可以自己编写代码来实现这个功能。
使用上一章的那个流程,将【字段拆分】步骤去掉,换成【Java代码】组件:
img
双击【Java代码】组件,打开配置窗口,展开左侧【Code Snippits】 -> 【Common use】,双击【Main】,即可自动生成一个Java代码模板:
img
我这里有写好的中文转拼音的代码:

package com.hnzs;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * Created with IntelliJ IDEA.
 * User: Staroon
 * Date: 2018-07-23
 * Time: 16:33:41
 * To change this template use File | Settings | File Templates.
 */
public class ToPinYin {
    public static void main(String[] args) {
        System.out.println(getPinYin("中国"));
    }

    public static String getPinYin(String CName) {

        // 中文转为拼音
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        StringBuffer sb = new StringBuffer();
        String[] tmpStr = null;

        for (int i = 0; i < CName.length(); i++) {

            try {
                tmpStr = PinyinHelper.toHanyuPinyinStringArray(CName.charAt(i), format);
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }

            if (tmpStr == null) {
                //非汉字直接拼接
                sb.append(CName.charAt(i));
            } else {
                sb.append(tmpStr[0]);
            }
        }
        return sb.toString();
    }
}

然后就是改造一下Kettle提供的Java模板,将getPinYin方法整块复制到processRow方法后面:
img
然后修改processRow方法里面的/* TODO:部分,get(Fields.In, "name").getString(r)表示获取数据流中指定的字段数据;get(Fields.Out, "ename").setValue(r, ename)用于设置输出字段。还要在最上面导入相关类,具体代码如下:

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

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

  Object[] r = getRow();

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

  r = createOutputRow(r, data.outputRowMeta.size());
  // Get the value from an input field
  String cname = get(Fields.In, "name").getString(r);
  String ename = getPinYin(cname);
  // Set a value in a new output field
  get(Fields.Out, "ename").setValue(r, ename);

  putRow(data.outputRowMeta, r);

  return true;
}

接着还要在最下面配置一下输出字段信息,有几个输出字段就需要配置几行:
img
保存,完事!真的完了吗?还没有!还需要导入依赖包,可以从代码中看出中文转拼音我是用的pinyin4j,向kettle lib目录下放入pinyin4j的jar包,然后重新启动Spoon
img
最后调整一下【字段选择】:
img
保存,运行,查看结果:
img

作业-SQL组件

作业中的SQL组件通常是用来执行DDL语句的,比较简单,与转换中的【表输入组件】类似,但没有数据输出。
新建一个作业,拖出【脚本】分组下的【SQL】组件,组成一个小流程:
img
编辑【SQL】组件,选择目标数据库连接,写上SQL内容,多个SQL使用英文分号分隔开,如果使用了参数变量记得勾选【使用变量替换】:
img
保存,运行,查看结果:
img
注:转换-脚本分组下也有两个【执行SQL脚本】的组件,有兴趣的可以去研究研究,我这里就不再介绍了。

作业-Shell组件

【Shell】组件是用来执行Windows下的批处理脚本的,也就是后缀为bat的脚本。
新建一个作业,拖出【Shell】组件,组成流程:
img
打开【Shell】组件配置窗口,第一项,勾选【插入脚本】表示在该组件中写脚本,右侧的【脚本】选项卡即是写脚本的位置,若不勾选【插入脚本】,则是通过执行指定脚本文件的方式。不建议勾选【插入脚本】选项,因为勾选【插入脚本】后,Kettle运行Shell的时候会先将脚本内容写到一个临时批处理文件中再去执行,很容易出现中文乱码情况。
【脚本文件名】配置项,用于指定批处理脚本文件位置,勾选【插入脚本】后,该项不可配置。
【工作路径】配置项,用于指定脚本工作路径,通俗的说,就是在哪个目录下运行这个脚本。
最下面的【字段】列表,用于配置脚本入参,可以使用参数变量。
img
这是脚本内容:

@echo off

::进入脚本所在目录
cd /D %~dp0

::在当前目录创建文件夹ShellTest
mkdir ShellTest

::复制脚本文件到ShellTest目录
copy Shell-test.bat ShellTest

echo %1 > ShellTest\hello.txt

保存,运行,查看结果:
img
运行日志:
img
转换-应用分组下有一个【运行SSH命令】的组件,是向Linux操作系统下远程执行Linux Shell的,有兴趣的可以去看看。

本章完!
下一章:对接大数据平台