Kettle系列教程-第九章:脚本组件
本系列教程基于Kettle 8.1(pdi-ce-8.1.0.0-365)。大部分内容同样适用于Kettle 7.x版本。
章节目录:
- 一、运行环境配置
- JDK
- JVM参数
- KETTLE_HOME
- 依赖包导入
- 二、转换与作业
- 转换流程
- 作业流程
- 三、数据库连接配置
- 创建数据库连接
- 共享数据库连接
- 数据库连接参数
- 四、资源库(数据库存储方式)
- 创建资源库
- 保存流程到资源库
- 从资源库打开流程
- 五、变量/参数
- 参数的配置与使用
- 变量的配置与使用
- 六、转换流程-输入组件
- Excel输入
- 表输入
- 七、转换流程-输出组件
- Excel输出
- 文本文件输出
- 表输出
- 八、转换流程-转换组件
- 九、脚本组件
- 转换-Java代码组件
- 作业-SQL组件
- 作业Shell组件
- 十、对接大数据平台
- 基础文件配置
- 上传文件到HDFS
- 连接Hive
- 十一、使用Windows计划任务定时执行Kettle作业
- 命令说明
- 编写批处理脚本执行Kettle作业
- 创建计划任务定时执行Kettle作业
- 十二、使用Java执行Kettle作业
- 搭建Kettle运行环境
- 代码示例(作业、转换、资源库)
本章说明
本章主要介绍一下转换中的【Java代码】组件和作业中的【SQL】和【Shell】组件。
转换-Java代码组件
在制作ETL流程的过程中,很有可能会遇到Kettle内置的组件无法满足使用的情况,这个时候就可以利用【Java代码组件】来满足我们的特殊需求,相当于自定义插件。比如我们需要一个将中文字符串转为拼音的功能,很显然,Kettle没有这个功能,我们就可以自己编写代码来实现这个功能。
使用上一章的那个流程,将【字段拆分】步骤去掉,换成【Java代码】组件:
双击【Java代码】组件,打开配置窗口,展开左侧【Code Snippits】 -> 【Common use】,双击【Main】,即可自动生成一个Java代码模板:
我这里有写好的中文转拼音的代码:
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方法后面:
然后修改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;
}
接着还要在最下面配置一下输出字段信息,有几个输出字段就需要配置几行:
保存,完事!真的完了吗?还没有!还需要导入依赖包,可以从代码中看出中文转拼音我是用的pinyin4j,向kettle lib目录下放入pinyin4j的jar包,然后重新启动Spoon:
最后调整一下【字段选择】:
保存,运行,查看结果:
作业-SQL组件
作业中的SQL组件通常是用来执行DDL语句的,比较简单,与转换中的【表输入组件】类似,但没有数据输出。
新建一个作业,拖出【脚本】分组下的【SQL】组件,组成一个小流程:
编辑【SQL】组件,选择目标数据库连接,写上SQL内容,多个SQL使用英文分号分隔开,如果使用了参数变量记得勾选【使用变量替换】:
保存,运行,查看结果:
注:转换-脚本分组下也有两个【执行SQL脚本】的组件,有兴趣的可以去研究研究,我这里就不再介绍了。
作业-Shell组件
【Shell】组件是用来执行Windows下的批处理脚本的,也就是后缀为bat的脚本。
新建一个作业,拖出【Shell】组件,组成流程:
打开【Shell】组件配置窗口,第一项,勾选【插入脚本】表示在该组件中写脚本,右侧的【脚本】选项卡即是写脚本的位置,若不勾选【插入脚本】,则是通过执行指定脚本文件的方式。不建议勾选【插入脚本】选项,因为勾选【插入脚本】后,Kettle运行Shell的时候会先将脚本内容写到一个临时批处理文件中再去执行,很容易出现中文乱码情况。
【脚本文件名】配置项,用于指定批处理脚本文件位置,勾选【插入脚本】后,该项不可配置。
【工作路径】配置项,用于指定脚本工作路径,通俗的说,就是在哪个目录下运行这个脚本。
最下面的【字段】列表,用于配置脚本入参,可以使用参数变量。
这是脚本内容:
@echo off
::进入脚本所在目录
cd /D %~dp0
::在当前目录创建文件夹ShellTest
mkdir ShellTest
::复制脚本文件到ShellTest目录
copy Shell-test.bat ShellTest
echo %1 > ShellTest\hello.txt
保存,运行,查看结果:
运行日志:
转换-应用分组下有一个【运行SSH命令】的组件,是向Linux操作系统下远程执行Linux Shell的,有兴趣的可以去看看。
本章完!
下一章:对接大数据平台