kettle(Pentaho Data Integration) 使用"最佳"实践

kettle 是一款基于JAVA的开源ETL工具,现在它的名字应该叫做Pentaho Data Integration(PDI)了, 非常优秀的一款工具,功能非常多,今天我们主要演示其Java API案例

案例

通过PDI工具,完成一个Job,主要目标是将表中的数据导出到dat文件中,导出的文件名字以user-开头,内容使用|作为分割符,后面的格式是YYYYMMDD后缀为dat. 例:user-20200502.dat

下载PDI

https://sourceforge.net/projects/pentaho/files/latest/download?aliId=137249511

启动PDI

linux环境下通过命令sh spoon.sh命令来启动,打开后如果对英文不熟悉,可以在工具菜单页修改默认语言,重启后生效

开始

打开之后,映入眼帘的是Job(作业)Transformation(转换)这里我们新建一个Job,作业中包含一个transformation,Job的作用是为了控制过程,transformation在这里启到的作用是将表中的数据写入到dat文件中

Job如下:

kettle-job-demo.jpg

transformation如下:

kettle-tr-demo.jpg

整个过程非常简单,托拉拽就完成了,特别说明几处要点。

双击表输入弹出如下窗口,没有数据库连接的情况下,需要点击数据库连接右侧的新建按钮,注意选择Generic database,如果提示找不到驱动,那么下载一个放到PDI的lib目录下重启即可

kettle-datasource.jpg
kettle-tr-input.jpg

双击文本文件输出文件页签中文件名称栏位可以制定文件路径,文件名可以是部分文件名,如下图的user-,这里扩展名栏位我们输入dat,指定日期格式栏位打钩,日期格式栏位是yyyyMMdd,在结果中添加文件名栏位打钩,显示文件名点击后可以预览最终生成的文件名称。

内容页签中分割符栏位修改为|

字段页签中一定要点击一下获取字段,否则字段页签全部为空,Job跑起来的时候也会报错。

kettle-file-fields.jpg
kettle-file-content.jpg
kettle-file.jpg

Java工程结构

kettle-demo-structure.jpg

Maven依赖

本次案例主要依赖如下jar包,其实也是kettle主要的依赖jar


            org.pentaho
            kettle-core
            9.0.0.0-423
            system
            ${project.basedir}/src/main/resources/lib/kettle-core-9.0.0.0-423.jar
        

        
            org.pentaho
            kettle-engine
            9.0.0.0-423
            system
            ${project.basedir}/src/main/resources/lib/kettle-engine-9.0.0.0-423.jar
        

        
            org.pentaho
            metastore
            9.0.0.0-423
            system
            ${project.basedir}/src/main/resources/lib/metastore-9.0.0.0-423.jar
        

        
        
            org.apache.commons
            commons-vfs2
            2.1
        

        
        
            com.google.guava
            guava
            29.0-jre
        

        
        
            commons-io
            commons-io
            2.6
        

        
        
            commons-lang
            commons-lang
            2.6
        

        
        
            commons-codec
            commons-codec
            1.14
        





        
        
            org.projectlombok
            lombok
            1.18.12
            provided
        

        
        
            mysql
            mysql-connector-java
            8.0.20
        

运行Job

package com.example.fg.kettle;


import lombok.extern.slf4j.Slf4j;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.Result;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @author cattle -  稻草鸟人
 * @date 2020/4/30 下午5:09
 */
@Slf4j
public class KettleTools {


    public static void runJob(String jobName, Map variable) {
        try {
            KettleEnvironment.init();
            JobMeta jobMeta = new JobMeta(jobName, null);
            Job job = new Job(null, jobMeta);
            variable.forEach((key, value) -> {
                job.setVariable(key, value);
            });
            job.start();
            job.waitUntilFinished();
            if (job.getErrors() > 0) {
                throw new Exception("There were errors during job execution");
            }
        } catch (Exception e) {
            log.error("runJob exception,jobName={}, exception={}", jobName, e);
        }
    }

    public static void main(String[] args) throws URISyntaxException {
        URL url = KettleTools.class.getResource("/kettle/kettle-job-demo.kjb");
        runJob(new File(url.toURI()).getAbsolutePath(), new HashMap<>());
    }
}

执行完成后,就可以在桌面上看到一个user-20200502.dat的文件,内容如下:

kettle-demo-ret.jpg

参考文档

[^PDI document]: Latest Pentaho Data Integration (aka Kettle) Documentation

源码地址

https://github.com/cattles/fucking-great-kettle.git

你可能感兴趣的:(kettle(Pentaho Data Integration) 使用"最佳"实践)