kettle插入更新流程

kettle轉換步驟工作組件

???????這里有四個類構成了這個kettle?步驟/節點,每一個類都有其特定的目的及所扮演的角色。

TemplateStep:??步驟類實現了StepInteface接口,在轉換運行時,它的實例將是數據實際處理的位置。每一個執行線程都表示一個此類的實例。

?

TemplateStepData: ?數據類用來存儲數據,當插件執行時,對于每個執行的線程都是唯一的。執行時里面存儲的東西主要包括數據庫連接、文件句柄、緩存等等其他東西。

?

TemplateStepMeta:?元數據類實現了StepMetaInterface接口。它的職責是保存和序列化特定步驟實例的配置,在我們這個例子中,它負責保存用戶設置的步驟名稱和輸出字段的名稱。

?

TemplateStepDialog:對話框類實現了該步驟與用戶交互的界面,它顯示一對話框,通過對話框用戶可以自己的喜好設定步驟的操作。對話框類與元數據類關系非常緊密,元數據類可以追蹤用戶的設置。

?

除了上面的代碼,還有一個plugin.xml,它設置好了插件的元數據,定義了步驟在kettle圖形工作臺中的顯示效果。為了更好的讓大家理解,我將利用這個步驟設計一個轉換流程并執行它。對于插件的開發,我們將從plugin.xml配置文件開始講起,然后講講元數據和對話框類,最后再講講步驟類和數據類。

?

書寫你自己的plugin.xml:

???????下面plugin.xml是我們這個插件里面的內容,它的功能是告訴kettle插件的元數據類,插件的名稱及描敘,還有需要加載的jar包。想要了解細節,可以查看文章:plug-in loading

<?xml version="1.0" encoding="UTF-8"?>

<plugin

???id="TemplatePlugin"

???iconfile="icon.png"

???description="Template Plugin"

???tooltip="Only there for demonstration purposes"

???category="Demonstration"

???classname="plugin.template.TemplateStepMeta">

???<libraries>

??????<library?name="templatestep.jar"/>

???</libraries>

</plugin>

?

ID:在kettle插件中必須全局唯一,因為被kettle序列化了,所以不要隨便改變

Iconfile: kettle中插件顯示的圖片,必須是png圖片

Description:插件描敘,顯示在樹形菜單里面。

Tooltip:樹形菜單中,鼠標滑過的時候顯示的提示信息

Category:插件顯示的父目錄

Classname:元數據類

Library:指明了插件需要加載所依賴的jar包

?

?

插件主要包含類介紹

一、元數據類:

?????????下面顯示了元數據的幾個關鍵的方法,注意元數據類里面用私有成員變量outputField 存儲了下一個步驟的輸出字段。

?// keep track of the step settings
public String getOutputField()
public void setOutputField(…)
public void setDefault()

// serialize the step settings to and from xml
public String getXML()
public void loadXML(…)

// serialize the step settings to and from a kettle repository
public void readRep(…)
public void saveRep(…)

// provide information about how the step affects the field structure of processed rows
public void getFields(…)

// perform extended validation checks for the step
public void check(…)

// provide instances of the step, data and dialog classes to Kettle
public StepInterface getStep(…)
public StepDataInterface getStepData()
public StepDialogInterface getDialog(…)?

TemplateStepMeta元數據類其實還有很多方面,不過大多被他的父類BaseStepMeta給默認實現了,這些默認的實現足以使我們的元數據類工作良好。想要了解更多,大家可以查查關于StepMetaInteface和BaseStepMeta的kettle官方文檔。

?

二、對話框類:

???????? TemeplateStepDialog為步驟實現了對話框的設置,kettle的用戶界面部件是使用的eclipse的swt框架,如果要開發比較復雜的對話框,你還必須熟悉大部分swt代碼。 Swt文檔大家可以從eclipse上的幫助菜單點擊在線獲取。在開發過程中,一個對話框對象擁有一個元數據對象,它記錄了應該從哪里讀取配置?應該把設置好的配置保存在哪里?它僅僅設置了輸出字段的名稱在我們這個模板步驟里面。一個繼承自BaseStepDialog特定的對話框類必須提供open(…)方法,這個方法必須返回這個步驟的名稱(發生改變時)或NULL(對話框被取消時)

?

?

三、步驟類:

?????????步驟類是實際的處理和轉換工作的地方。因為大部分樣本代碼已經由父類BaseStep提供了,大多數插件僅僅關注下面幾個特定的方法就行。

?// initialization and teardown
public boolean?init(…)
public void?dispose(..)

// processing rows
public void?run()
public boolean?processRow(..)

Init()方法在轉換執行前被kettle調用,轉換必須在所有步驟初始化成功時才真正執行。我們這個模板步驟沒有做任何事情,這里僅僅是拿出來讓大家了解了解。

dispose()方法是在步驟執行完之后執行(非轉換執行完哈),它完成資源的關閉,像文件句柄、緩存等等。

run()方法在實際處理記錄集的時候調用。里面其實是個調用processRow()方法處理記錄的小循環,當此步驟再沒有數據處理或轉換被停止時退出循環。

processRow()方法在處理單條記錄的時候被調用。這個方法通常通過調用getRow()來獲取需要處理的單條記錄。 這個方法如果有需要將會被阻塞,例如當此步驟希望放慢腳步處理數據時。processRow()隨后的流程將執行轉換工作并調用putRow()方法將處理過的記錄放到它的下游步驟。

注意:你的步驟可能會變記錄的結構,為了安全起見,一定要多熟悉包org.pentaho.di.core.row,特別是類RowMetaInterface和RowDataUtil。

??基類BaseStep對處理的記錄提供了第一次訪問的標識,在某些代碼只執行一次的時候可能非常有用,例如某個費時的查找,其實這就是緩存。

?

四、數據類:

?????????大多數步驟都需要臨時的緩沖或者臨時的數據。數據類就是這些數據合適的存放位置。每一個執行線程將得到其擁有的數據類實例,所以它能在獨立的空間里面運行。TemplateStepData繼承自BaseStepData,作為一個經驗法則,不要將non-constant字段放置BaseStepData類里面,如果你必須,請將它最好放置TemplateStepData數據類里面.

?

我們的步驟僅僅使用了一個數據對象來存儲記錄集輸出的結構,沒有用到其他的存儲介質,例如文件等等。

開發插件實例

1.???????在kettle-steps.xml下添加如下節點

?

?

<step?id="MyTest">

???????<description>MyTest</description>

???????<classname>mytest.MyTestMeta</classname>

???????<category>插件測試</category>

???????<tooltip>測試</tooltip>

???????<iconfile>ui/images/TIP.png</iconfile>

????</step>

?

?

?

?

?

?

?

?

?

?

2.???????創建插件類

?

MyTest類代碼

?

package?mytest;

?

import?org.pentaho.di.trans.Trans;

import?org.pentaho.di.trans.TransMeta;

import?org.pentaho.di.trans.step.BaseStep;

import?org.pentaho.di.trans.step.StepDataInterface;

import?org.pentaho.di.trans.step.StepInterface;

import?org.pentaho.di.trans.step.StepMeta;

?

?

publicclass?MyTest?extends?BaseStep?implements?StepInterface {

?

public?MyTest(StepMeta stepMeta, StepDataInterface stepDataInterface,

????????int?copyNr, TransMeta transMeta, Trans trans) {

????super(stepMeta, stepDataInterface, copyNr, transMeta, trans);

????//?TODO?Auto-generated constructor stub

}

?

}

?

?

MyTestData類代碼

?

?

package?mytest;

?

import?org.pentaho.di.trans.step.BaseStepData;

import?org.pentaho.di.trans.step.StepDataInterface;

?

publicclass?MyTestData?extends?BaseStepData?implements?StepDataInterface?{

?

}

?

MyTestMeta類代碼

?

package?mytest;

?

import?java.util.List;

import?java.util.Map;

?

import?org.pentaho.di.core.CheckResultInterface;

import?org.pentaho.di.core.Counter;

import?org.pentaho.di.core.database.DatabaseMeta;

import?org.pentaho.di.core.exception.KettleException;

import?org.pentaho.di.core.exception.KettleXMLException;

import?org.pentaho.di.core.row.RowMetaInterface;

import?org.pentaho.di.repository.ObjectId;

import?org.pentaho.di.repository.Repository;

import?org.pentaho.di.trans.Trans;

import?org.pentaho.di.trans.TransMeta;

import?org.pentaho.di.trans.step.BaseStepMeta;

import?org.pentaho.di.trans.step.StepDataInterface;

import?org.pentaho.di.trans.step.StepInterface;

import?org.pentaho.di.trans.step.StepMeta;

import?org.pentaho.di.trans.step.StepMetaInterface;

import?org.w3c.dom.Node;

?

publicclass?MyTestMeta?extends?BaseStepMeta?implements?StepMetaInterface {

?

????public?MyTestMeta()

????{

???????super();

????}

????@Override

????publicvoid?setDefault() {

???????//?TODO?Auto-generated method stub

?

????}

?

????@Override

????publicvoid?loadXML(Node stepnode, List<DatabaseMeta> databases,

???????????Map<String, Counter> counters)?throws?KettleXMLException {

???????//?TODO?Auto-generated method stub

?

????}

?

????@Override

????publicvoid?saveRep(Repository rep, ObjectId id_transformation,

???????????ObjectId id_step)?throws?KettleException {

???????//?TODO?Auto-generated method stub

?

????}

?

????@Override

????publicvoid?readRep(Repository rep, ObjectId id_step,

???????????List<DatabaseMeta> databases, Map<String, Counter> counters)

???????????throws?KettleException {

???????//?TODO?Auto-generated method stub

?

????}

?

????@Override

????publicvoid?check(List<CheckResultInterface> remarks, TransMeta transMeta,

???????????StepMeta stepMeta, RowMetaInterface prev, String[] input,

???????????String[] output, RowMetaInterface info) {

???????//?TODO?Auto-generated method stub

?

????}

?

????@Override

????public?StepInterface getStep(StepMeta stepMeta,

???????????StepDataInterface stepDataInterface,?int?copyNr,

???????????TransMeta transMeta, Trans trans) {

???????//?TODO?Auto-generated method stub

???????returnnull;

????}

?

????@Override

????public?StepDataInterface getStepData() {

???????//?TODO?Auto-generated method stub

???????returnnull;

????}

?

}

?

?

?

MyTestDialog類代碼

?

package?mytest;

?

import?org.eclipse.swt.SWT;

import?org.eclipse.swt.widgets.Display;

import?org.eclipse.swt.widgets.Shell;

import?org.pentaho.di.trans.TransMeta;

import?org.pentaho.di.trans.step.BaseStepMeta;

import?org.pentaho.di.trans.step.StepDialogInterface;

import?org.pentaho.di.ui.trans.step.BaseStepDialog;

?

publicclass?MyTestDialog?extends?BaseStepDialog?implements?StepDialogInterface {

???

????public?MyTestDialog(Shell parent, Object in,

???????????TransMeta transMeta, String stepname) {

???????super(parent, (BaseStepMeta)in, transMeta, stepname);

???????//?TODO?Auto-generated constructor stub

????}

?

????@Override

????public?String open() {

???????Shell parent = getParent();

???????Display?display?= parent.getDisplay();

?

???????shell?=?new?Shell(parent, SWT.DIALOG_TRIM?| SWT.RESIZE?| SWT.MAX?| SWT.MIN);

???????props.setLook(shell);

???????shell.open();

???????shell.setSize(200, 200);

???????shell.setText("hello");

???????returnnull;

????}

?

}

?

?

除TestDialog類外的3個類的代碼都是在加入繼承基類和接口后更加eclipse插件提示自動生成的,也是我們自己需要實現的方法,TestDialog類中的MyTestDialog方法參數是固定的,根據生成的需要修改下,open函數是要我們自己實現的,運行效果如下

?

雙擊MyTest后彈出一個空白的窗口

?

調用use define java class?插件

以kettle中自帶的samples\transformations\User Defined Java Class - Calculate the date of Easter.ktr為例

public boolean?processRow(StepMetaInterface smi, StepDataInterface sdi)?throws?KettleException

{

? Object[] r=getRow();//從阻塞隊列中獲取一個數據對象(一行數據記錄)

??if?(r==null)//如果沒有可獲取的數據,代表以處理完成

? {

????setOutputDone();//設置處理完成標志

????return?false;//退出循環

? }

?

??if?(first) {//第一次進入循環

??? //初始化動作

???? first=false;//設置為非第一次循環

? }

?/*

*處理函數

*/

??logBasic(r[0].toString());//打印

??putRow(data.outputRowMeta, r);//輸出到阻塞隊列

??return?true;

}

use define java class?插件其實就是一個空插件,然后我們自己來實現processRow函數體,kettle通過while循環來調用processRow函數一行一行的處理數據,流程如下所示


來源:?http://blog.csdn.net/qq250941970/article/details/7695897

轉載于:https://www.cnblogs.com/tuanz/p/8709231.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打開mobilenet——ssd的demo.py顯示這樣的錯誤解決方法:Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.s

終于找到方法了&#xff1a; ubuntu14.04打開終端&#xff1a; conda install nomkl numpy scipy scikit-learn numexpr conda remove mkl mkl-service一切ok。。。。。

C++ class、struct區別

一、默認訪問控制不同&#xff08;最主要&#xff09; struct默認為public&#xff0c;class默認為private。這個訪問控制既是指成員的默認訪問屬性&#xff0c;又指繼承時默認的繼承屬性。 二、定義template時不同 在模版中&#xff0c;類型參數前面可以使用class或typename&a…

Alpine Linux詳解

簡介 Small. Simple. Secure.Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. Alpine Linux 是一個社區開發的面向安全應用的輕量級Linux發行版。 Alpine 的意思是“高山的”&#xff0c;它采用了musl libc和busybox以減…

java stream 原理

java stream 原理 需求 從"Apple" "Bug" "ABC" "Dog"中選出以A開頭的名字&#xff0c;然后從中選出最長的一個&#xff0c;并輸出其長度 1. 最直白的實現 缺點 迭代次數過多頻繁產生中間結果&#xff0c;性能無法接受2. 平常寫法 int …

ubuntu文本模式獲得權限修改profile

針對ubuntu14.04以下&#xff0c;越舊版本&#xff0c;舊的指令也有效。 進入登錄頁面&#xff0c;按shiftaltF1進入root環境&#xff0c;驗證用戶名密碼。 然后輸入&#xff1a;cd /etc 進入etc文件 在輸入&#xff1a;/usr/bin/sudo vi profile 進入profile文件的文本編輯模…

here文檔 here doc EOF重定向

here文檔 here doc EOF重定向 http://www.cnblogs.com/xiangzi888/archive/2012/03/24/2415077.html 在shell腳本程序中&#xff0c;向一條命令傳遞輸入的一種特殊方法是使用here文檔。一個here document就是一段帶有特殊目的的代碼段。它使用I/O重定向的形式將一個命令序列傳…

Java常量池理解與總結

2019獨角獸企業重金招聘Python工程師標準>>> 一.相關概念 什么是常量用final修飾的成員變量表示常量&#xff0c;值一旦給定就無法改變&#xff01;final修飾的變量有三種&#xff1a;靜態變量、實例變量和局部變量&#xff0c;分別表示三種類型的常量。Class文件中…

轉載:https://blog.csdn.net/dcrmg/article/details/52939318

張正友相機標定Opencv實現以及標定流程&&標定結果評價&&圖像矯正流程解析&#xff08;附標定程序和棋盤圖&#xff09;使用Opencv實現張正友法相機標定之前&#xff0c;有幾個問題事先要確認一下&#xff0c;那就是相機為什么需要標定&#xff0c;標定需要的輸…

Redis學習筆記--Redis數據過期策略詳解==轉

本文對Redis的過期機制簡單的講解一下  講解之前我們先拋出一個問題&#xff0c;我們知道很多時候服務器經常會用到redis作為緩存&#xff0c;有很多數據都是臨時緩存一下&#xff0c;可能用過之后很久都不會再用到了&#xff08;比如暫存session&#xff0c;又或者只存放日行…

會員連鎖配置以及金額走向

PS&#xff1a;所有電子支付方式的資金走向都是同樣的&#xff0c;配置的是什么支付方式就走什么支付方式;下面以支付寶為例說明 一、連鎖非總機模式 資金走向&#xff1a; 支付寶&#xff1a;收到的錢在主賬號配置的支付寶&#xff0c;會員卡的金額在主賬號 微信&#xff1a;收…

Python標準模塊--logging

Python標準模塊--logging參考http://www.cnblogs.com/zhbzz2007/p/5943685.html1 logging模塊簡介logging模塊是Python內置的標準模塊&#xff0c;主要用于輸出運行日志&#xff0c;可以設置輸出日志的等級、日志保存路徑、日志文件回滾等&#xff1b;相比print&#xff0c;具備…

Podfile grammar

參考&#xff1a;http://www.jianshu.com/p/8af475c4f717 Podfile Podfile文件詳細描述了一個或多個工程中targets的依賴關系。Podfile會默認創建一個隱式的目標鏈接到工程中用戶的第一個target&#xff0c;名稱為“default”。 一個Podfile可以非常簡單: *pod AFNetworking, ~…

并發編程 - 協程 - 1.協程概念/2.greenlet模塊/3.gevent模塊/4.gevent實現并發的套接字通信...

1.協程并發&#xff1a;切保存狀態單線程下實現并發&#xff1a;協程 切 保存狀態 yield 遇到io切&#xff0c;提高效率 遇到計算切&#xff0c;并沒有提高效率 檢測單線程下 IO行為 io阻塞 切 相當于騙操作系統 一直處于計算協程&#xff1a;。。。單線程下實現…

pymysql

連接數據庫 連接時需要額外指定參數dbcursor.execute( ) 操作SQL語句SELECT VERSION() 獲得當前版本CREATE DATABASE spiders DEFAULT CHARACTER SET utf8 創建數據庫import pymysql db pymysql.connect(hostlocalhost,user ,password ,port3306)#IP&#xff0c;用戶名&#x…

C# 多線程及同步簡介示例

60年代&#xff0c;在OS中能擁有資源和獨立運行的基本單位是進程&#xff0c;然而隨著計算機技術的發展&#xff0c;進程出現了很多弊端&#xff0c;一是由于進程是資源擁有者&#xff0c;創建、撤消與切換存在較大的時空開銷&#xff0c;因此需要引入輕型進程&#xff1b;二是…

opencv-python單目視覺標定,簡單易用。

import cv2 import numpy as np import glob# 設置尋找亞像素角點的參數&#xff0c;采用的停止準則是最大循環次數30和最大誤差容限0.001 criteria (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 獲取標定板角點的位置 objp np.zeros((6 * 7, 3), np.f…

python多線程多進程

一、線程&進程 對于操作系統來說&#xff0c;一個任務就是一個進程&#xff08;Process&#xff09;&#xff0c;比如打開一個瀏覽器就是啟動一個瀏覽器進程&#xff0c;打開一個記事本就啟動了一個記事本進程&#xff0c;打開兩個記事本就啟動了兩個記事本進程&#xff0c…

Spring Framework 5.1.6、5.0.13 與?4.3.23 發布

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; Spring Framework 5.1.6、5.0.13 與 4.3.23 發布了。 v5.1.6 包含 49 個 bug 修復和功能改進&#xff1b;v5.0.13 是 5.0.x 系列的最后一個版本&#xff0c;包含了 25 個 bug 修復和功能改進&am…

curl命令

Curl是一種支持多種協議&#xff08;http、https&#xff0c;ftp&#xff09;等&#xff0c;利用url規則在命令行下工作的文件傳輸工具&#xff0c;還支持POST、cookies、認證、從指定偏移處下載部分文件、用戶代理字符串、限速、文件大小、進度條等特征 1.語法&#xff1a; cu…

單目視覺標定:世界坐標系、相機坐標系、圖像坐標系、像素坐標系——簡單粗暴,粗暴

轉&#xff1a;https://blog.csdn.net/chentravelling/article/details/53558096 1.正文 圖像處理、立體視覺等等方向常常涉及到四個坐標系&#xff1a;世界坐標系、相機坐標系、圖像坐標系、像素坐標系。例如下圖&#xff1a; 構建世界坐標系只是為了更好的描述相機的位置在哪…