kettle是一个用java写的开源ETL工具,工作中用到了,分享一下使用
安装:
下载解压即可:
解压完成后,安装环境变量
vim ~/.bash_profile下编辑
编辑完成后source bash_profile即可。
进入解压目录 sh spoon.sh即可运行
运行效果如下
注意,最新版本需要JDK1.8
安装完成后就可以使用了
kettle文件有二种类型 job 和 trans(转换) ,job从类型上看应该是trans的扩展版本
job:job中可以直接调用转换
trans:
介绍一下常用的组件
设置变量
可以设置job内的全局变量,我这边直接是从配置文件读取
数据库的配置
Json格式数据的处理
java脚本
这里详细说一下,java脚本必须要实现如下的方法
public boolean
processRow
(StepMetaInterface smi, StepDataInterface sdi)
throws
KettleException {
}
双击此处Main可以快速生成如上方法
可以引用额外的方法
但是你的lib下或者项目中必须要有对应的jar,否则报错
获取输出字段
Object[] r =
getRow
();
if
(r == null) {
setOutputDone
();
return
false;
}
r = createOutputRow(r, data.outputRowMeta.size());
新增输出字段如下
获取指定的输入字段
String zhengxinJson = get(Fields.In,
"limuzhengxinJson"
).getString(r);
字段的过滤和修改
行转列
这个是将横表改成纵表,由于需求变更,对应的部分被我删除了,后续再补上
数据的入库
数据直接的连接
kettle的日志配置
库表的记录如下
配置文件加载,配置在命名参数里面即可
上面做好,会生成对应的job/trans文件
java的调度
文件生成好,如何在项目里调用了?
1.新增依赖
<
kettle.version
>
8.0.0.1-67
</
kettle.version
>
<!-- kettle -->
<dependency>
<groupId>pentaho-kettle
</groupId>
<artifactId>kettle-core
</artifactId>
<version>${kettle.version}
</version>
<exclusions>
<exclusion>
<groupId>jug-lgpl
</groupId>
<artifactId>jug-lgpl
</artifactId>
</exclusion>
<exclusion>
<artifactId>commons-vfs2
</artifactId>
</exclusion>
<exclusion>
<groupId>secondstring
</groupId>
<artifactId>secondstring
</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j
</groupId>
<artifactId>slf4j-log4j12
</artifactId>
</exclusion>
<exclusion>
<artifactId>xercesImpl
</artifactId>
<groupId>xerces
</groupId>
</exclusion>
<exclusion>
<groupId>org.apache.xmlgraphics
</groupId>
<artifactId>batik-js
</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.verhas
</groupId>
<artifactId>license3j
</artifactId>
<version>1.0.7
</version>
</dependency>
<dependency>
<groupId>pentaho-kettle
</groupId>
<artifactId>kettle-dbdialog
</artifactId>
<version>${kettle.version}
</version>
</dependency>
<dependency>
<groupId>pentaho-kettle
</groupId>
<artifactId>kettle-engine
</artifactId>
<version>${kettle.version}
</version>
</dependency>
<dependency>
<groupId>pentaho
</groupId>
<artifactId>metastore
</artifactId>
<version>${kettle.version}
</version>
</dependency>
<dependency>
<groupId>com.google.guava
</groupId>
<artifactId>guava
</artifactId>
<version>19.0
</version>
</dependency>
<dependency>
<groupId>org.pentaho.di.plugins
</groupId>
<artifactId>kettle-json-plugin-core
</artifactId>
<version>8.0.0.0-28
</version>
</dependency>
<dependency>
<groupId>org.pentaho.di.plugins
</groupId>
<artifactId>kettle-json-plugin
</artifactId>
<version>8.0.0.0-28
</version>
<type>zip
</type>
</dependency>
<!-- kettle —>
新增仓库地址
<repository>
<id>pentaho-public
</id>
<name>Pentaho Public
</name>
<releases>
<enabled>true
</enabled>
<updatePolicy>always
</updatePolicy>
</releases>
<snapshots>
<enabled>true
</enabled>
<updatePolicy>always
</updatePolicy>
</snapshots>
</repository>
新增插件地址
<pluginRepository>
<id>pentaho-public</id>
<name>Pentaho Public</name>
<url>
http://nexus.pentaho.org/content/groups/omni</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
Pom文件配置好后
*/
public synchronized void
callNativeTransWithParams(String[] params
,String transFileName)
throws Exception {
// 解决jar包冲突
System.
setProperty(
"javax.xml.parsers.DocumentBuilderFactory"
,
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl")
;
// 设置本地的插件
StepPluginType.
getInstance().getPluginFolders().add(
newPluginFolder(
"/opt/scf/ec/provider/kettle/plugins"
, false, true))
;
// 加载插件
KettleEnvironment.
init()
;
// 初始化系统环境变量
EnvUtil.
environmentInit()
;
// 生成一个转换元
TransMeta transMeta =
new TransMeta(transFileName)
;
//transMeta.setVariable();
// 转换
Trans trans =
new Trans(transMeta)
;
// 执行
trans.execute(params)
;
// 等待结束
trans.waitUntilFinished()
;
}
/**
* 调用job文件
* callNativeJob:
TODO
*
*
@param
jobName
*
@throws
Exception
*
@throws
*/
public synchronized void
callNativeJob(String jobName)
throws Exception {
// 解决jar包冲突
System.
setProperty(
"javax.xml.parsers.DocumentBuilderFactory"
,
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl")
;
// 设置本地的插件
StepPluginType.
getInstance().getPluginFolders().add(
newPluginFolder(
"/opt/scf/ec/provider/kettle/plugins"
, false, true))
;
// 初始化
KettleEnvironment.
init()
;
JobMeta
jobMeta =
new JobMeta(jobName
, null)
;
Job job =
new Job(
null,
jobMeta)
;
// 设置参数
// job.setVariable(paraname, paravalue);
job.start()
;
job.waitUntilFinished()
;
}
这里说下这二句代码:(ps,这二个问题,纠结了半天,在stackoverflow上找到了答案)
第一个是解决jar包冲突
System.
setProperty(
"javax.xml.parsers.DocumentBuilderFactory"
,
"
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
”)
;
第二个是解决插件不存在的错误
StepPluginType.
getInstance().getPluginFolders().add(
newPluginFolder(
"/opt/scf/ec/provider/kettle/plugins"
, false, true))
;
这样我们就能在项目中调度生成的文件
kettleUtil.callNativeJob(KettleConst.
KETTLE_SHOP_JOB);
我参考了网上很多的集成代码,很多已经过时了,我这个应该算是最新的,maven库依赖都是我从官网上一个一个找的
网上的maven库都不能用,以此参考
上面案例的地址:
https://github.com/krauser1991/kettle