kettle(Pentaho Data Integration) 使用"最佳"實踐

kettle 是一款基于JAVA的開源ETL工具,現(xiàn)在它的名字應(yīng)該叫做Pentaho Data Integration(PDI)了, 非常優(yōu)秀的一款工具,功能非常多,今天我們主要演示其Java API案例

案例

通過PDI工具,完成一個Job,主要目標(biāo)是將表中的數(shù)據(jù)導(dǎo)出到dat文件中,導(dǎo)出的文件名字以user-開頭,內(nèi)容使用|作為分割符,后面的格式是YYYYMMDD后綴為dat. 例:user-20200502.dat

下載PDI

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

啟動PDI

linux環(huán)境下通過命令sh spoon.sh命令來啟動,打開后如果對英文不熟悉,可以在工具菜單頁修改默認語言,重啟后生效

開始

打開之后,映入眼簾的是Job(作業(yè))Transformation(轉(zhuǎn)換)這里我們新建一個Job,作業(yè)中包含一個transformation,Job的作用是為了控制過程,transformation在這里啟到的作用是將表中的數(shù)據(jù)寫入到dat文件中

Job如下:

kettle-job-demo.jpg

transformation如下:

kettle-tr-demo.jpg

整個過程非常簡單,托拉拽就完成了,特別說明幾處要點。

雙擊表輸入彈出如下窗口,沒有數(shù)據(jù)庫連接的情況下,需要點擊數(shù)據(jù)庫連接右側(cè)的新建按鈕,注意選擇Generic database,如果提示找不到驅(qū)動,那么下載一個放到PDI的lib目錄下重啟即可

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

雙擊文本文件輸出,文件頁簽中文件名稱欄位可以制定文件路徑,文件名可以是部分文件名,如下圖的user-,這里擴展名欄位我們輸入dat,指定日期格式欄位打鉤,日期格式欄位是yyyyMMdd,在結(jié)果中添加文件名欄位打鉤,顯示文件名點擊后可以預(yù)覽最終生成的文件名稱。

內(nèi)容頁簽中分割符欄位修改為|

字段頁簽中一定要點擊一下獲取字段,否則字段頁簽全部為空,Job跑起來的時候也會報錯。

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

Java工程結(jié)構(gòu)

kettle-demo-structure.jpg

Maven依賴

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

<dependency>
            <groupId>org.pentaho</groupId>
            <artifactId>kettle-core</artifactId>
            <version>9.0.0.0-423</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/kettle-core-9.0.0.0-423.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.pentaho</groupId>
            <artifactId>kettle-engine</artifactId>
            <version>9.0.0.0-423</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/kettle-engine-9.0.0.0-423.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.pentaho</groupId>
            <artifactId>metastore</artifactId>
            <version>9.0.0.0-423</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/metastore-9.0.0.0-423.jar</systemPath>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.14</version>
        </dependency>





        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

運行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<String, String> 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<>());
    }
}

執(zhí)行完成后,就可以在桌面上看到一個user-20200502.dat的文件,內(nèi)容如下:

kettle-demo-ret.jpg

參考文檔

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

源碼地址

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容