kettle的入門

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 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>
    <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>
    <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
*@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


發佈了36 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章