kettle的入门

来源:互联网 发布:怎么在淘宝上投诉卖家 编辑:程序博客网 时间:2024/05/22 12:25
kettle是一个用java写的开源ETL工具,工作中用到了,分享一下使用

安装:
下载解压即可:
下载地址  https://nchc.dl.sourceforge.net/project/pentaho/Data%20Integration/7.1/pdi-ce-7.1.0.0-12.zip

解压完成后,安装环境变量
vim ~/.bash_profile下编辑
编辑完成后source bash_profile即可。
进入解压目录 sh spoon.sh即可运行
运行效果如下
注意,最新版本需要JDK1.8

安装完成后就可以使用了
kettle文件有二种类型 job 和 trans(转换) ,job从类型上看应该是trans的扩展版本
job:job中可以直接调用转换
trans:


介绍一下常用的组件
设置变量
可以设置job内的全局变量,我这边直接是从配置文件读取
数据库的配置
Json格式数据的处理
java脚本
这里详细说一下,java脚本必须要实现如下的方法
public booleanprocessRow(StepMetaInterface smi, StepDataInterface sdi)throwsKettleException {
}

双击此处Main可以快速生成如上方法

可以引用额外的方法
但是你的lib下或者项目中必须要有对应的jar,否则报错
获取输出字段
 Object[] r =getRow();
  if(r == null) {
    setOutputDone();
    returnfalse;
  }
  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>
            <groupId>org.apache.commons</groupId>
            <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>
    <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>
</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
*
* @paramjobName
*@throwsException
* @throws
*/
public synchronized void callNativeJob(String jobName)throwsException {
       // 解决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


原创粉丝点击