1. 程式人生 > >ETL之kettle進行二次開發簡單demo

ETL之kettle進行二次開發簡單demo

demo,利用kettle的api,將一個數據源中的資訊匯入到另外一個數據源中:

package cn.com.saidi.job;

import org.apache.commons.io.FileUtils;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleDatabaseException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.insertupdate.InsertUpdateMeta;
import org.pentaho.di.trans.steps.tableinput.TableInputMeta;

import java.io.File;

/**
 * Created by 戴橋冰 on 2017/1/16.
 */
public class TransDemo {

	public static TransDemo transDemo;

	/**
	 * 兩個庫中的表名
	 */
	public static String bjdt_tablename = "test1";
	public static String kettle_tablename = "test2";

	/**
	 * 資料庫連線資訊,適用於DatabaseMeta其中 一個構造器DatabaseMeta(String xml)
	 */
	public static final String[] databasesXML = {

			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
					"<connection>" +
					"<name>bjdt</name>" +
					"<server>192.168.1.122</server>" +
					"<type>Mysql</type>" +
					"<access>Native</access>" +
					"<database>daiqiaobing</database>" +
					"<port>3306</port>" +
					"<username>root</username>" +
					"<password>root</password>" +
  					"</connection>",
			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
					"<connection>" +
					"<name>kettle</name>" +
					"<server>192.168.1.122</server>" +
					"<type>Mysql</type>" +
					"<access>Native</access>" +
					"<database>daiqiaobing</database>" +
					"<port>3306</port>" +
					"<username>root</username>" +
					"<password>root</password>" +
 					"</connection>"

	};

	public static void main(String[] args) {
		try {
			KettleEnvironment.init();
			transDemo = new TransDemo();
			TransMeta transMeta = transDemo.generateMyOwnTrans();
			String transXml = transMeta.getXML();
			String transName = "etl/update_insert_Trans.ktr";
			File file = new File(transName);
			FileUtils.writeStringToFile(file, transXml, "UTF-8");
			System.out.println(databasesXML.length+"\n"+databasesXML[0]+"\n"+databasesXML[1]);
 		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
	}

	/**
	 * 生成一個轉化,把一個數據庫中的資料轉移到另一個數據庫中,只有兩個步驟,第一個是表輸入,第二個是表插入與更新操作
	 * @return
	 * @throws KettleXMLException
	 */
	public TransMeta generateMyOwnTrans() throws KettleXMLException, KettleDatabaseException {
		System.out.println("************start to generate my own transformation***********");
		TransMeta transMeta = new TransMeta();
		//設定轉化的名稱
		transMeta.setName("insert_update");
		//新增轉換的資料庫連線
		for (int i=0;i<databasesXML.length;i++){
			DatabaseMeta databaseMeta = new DatabaseMeta(databasesXML[i]);
			transMeta.addDatabase(databaseMeta);
		}
		//registry是給每個步驟生成一個標識Id用
		PluginRegistry registry = PluginRegistry.getInstance();
		//第一個表輸入步驟(TableInputMeta)
		TableInputMeta tableInput = new TableInputMeta();
		String tableInputPluginId = registry.getPluginId(StepPluginType.class, tableInput);
		//給表輸入新增一個DatabaseMeta連線資料庫
		DatabaseMeta database_bjdt = transMeta.findDatabase("bjdt");
		tableInput.setDatabaseMeta(database_bjdt);
		String select_sql = "SELECT name  FROM "+bjdt_tablename;
		tableInput.setSQL(select_sql);

		//新增TableInputMeta到轉換中
		StepMeta tableInputMetaStep = new StepMeta(tableInputPluginId,"table input",tableInput);
		//給步驟新增在spoon工具中的顯示位置
		tableInputMetaStep.setDraw(true);
		tableInputMetaStep.setLocation(100, 100);
		transMeta.addStep(tableInputMetaStep);

		//第二個步驟插入與更新
		InsertUpdateMeta insertUpdateMeta = new InsertUpdateMeta();
		String insertUpdateMetaPluginId = registry.getPluginId(StepPluginType.class,insertUpdateMeta);
		//新增資料庫連線
		DatabaseMeta database_kettle = transMeta.findDatabase("kettle");
  		insertUpdateMeta.setDatabaseMeta(database_kettle);
		//設定操作的表
		insertUpdateMeta.setTableName(kettle_tablename);
		//設定用來查詢的關鍵字
		insertUpdateMeta.setKeyLookup(new String[]{"name"});
		insertUpdateMeta.setKeyStream(new String[]{"name"});
		insertUpdateMeta.setKeyStream2(new String[]{""});//一定要加上
		insertUpdateMeta.setKeyCondition(new String[]{"="});

		//設定要更新的欄位
 		String[] updatelookup = {"name"} ;

		String [] updateStream = {"name"};
 		Boolean[] updateOrNot = {true};
		insertUpdateMeta.setUpdateLookup(updatelookup);
		insertUpdateMeta.setUpdateStream(updateStream);
		insertUpdateMeta.setUpdate(updateOrNot);
		String[] lookup = insertUpdateMeta.getUpdateLookup();
		//新增步驟到轉換中
		StepMeta insertUpdateStep = new StepMeta(insertUpdateMetaPluginId,"insert_update",insertUpdateMeta);
		insertUpdateStep.setDraw(true);
		insertUpdateStep.setLocation(250,100);
		transMeta.addStep(insertUpdateStep);
		//******************************************************************

		//******************************************************************

		//新增hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(tableInputMetaStep, insertUpdateStep));
		System.out.println("***********the end************");
		return transMeta;
	}

}


上述操作將會產生一個ktr檔案,接下來的操作是對ctr檔案進行轉換:

public static void main(String[] args) throws KettleException {
		//初始化ketlle
		KettleEnvironment.init();
		//建立轉換元資料物件
		TransMeta meta = new TransMeta("etl/update_insert_Trans.ktr");
		Trans trans = new Trans(meta);
		trans.prepareExecution(null);
		trans.startThreads();
		trans.waitUntilFinished();
		if(trans.getErrors()!=0){
			System.out.println("執行失敗!");
		}
	}

相關推薦

ETLkettle進行開發簡單demo

demo,利用kettle的api,將一個數據源中的資訊匯入到另外一個數據源中: package cn.com.saidi.job; import org.apache.commons.io.FileUtils; import org.pentaho.di.core.Ke

vue2.0 日曆日程表 ,可進行開發.

由於工作業務需求,要寫一個日程表,日程表寫之前 要先生成日曆,廢話不多說,直接 上程式碼: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="X-UA-Comp

移動端車牌識別技術,基於Android、iOS平臺,可進行開發

目前,我國警務通、停車場手持收費機等移動終端的使用比較普及,如果在這些終端上能夠整合車牌識別功能,對於維護交通安全和城市治安,實現交通自動化管理有著現實的意義。現在出現一款基於移動終端平臺的移動端車牌識別SDK,可方便的植入到警務通、手持收費機、掌上電腦、手機等

使用AcrGis進行開發(一)ArcGIS Engine授權及其物件模型介紹

一、ArcGIS Engine對Visual Studio的授權 我們在使用ArcGIS Engine進行二次開發的時候,必須要對VS進行授權,授權包括兩個方面:專案檔案(ArcSDK)授權以及模組授權(使用特定的模組,比如空間分析,網路分析,拓撲分析等需要額外

Alios-Thingswifi模組開發-(1)搭建Alios-Things開發環境(基於ubuntu 16.0.4)

一、安裝流程如下:     1.先安裝VSCode,保證有個可視的編輯器;      2.然後安裝aos-cube,是編譯工具;      3.最後安裝git工具,下載Alios-Things國內託管倉庫程式

五、Sketchup用ruby進行開發--建立圖形(面及pushpull、followMe方法的應用)

在上一節講到了如何建立直線、曲線、圓及弧線,本節講如何建立面和使用push/pull和Follow Me方法對面進行推拉建立三維體。 1、建立面 建立面使用的方法是add_face,也是繼承於Entities父類。add_face的引數是由一系列用逗號分割開的點或邊,下面看

四、Sketchup用ruby進行開發--Edge Arrays: Curves, Circles, Arcs和 Polygons

我們可以在Sketchup中用“弧”和“圓”工具去畫出相應圖形,但是我們畫出來並不是真正意義上的圓或弧形,而是由一段段細小的直線片段組成的。用編碼實現時,實體類有三個方法來生成類似於弧形的圖案,每一個方法返回的是一組邊物件集。這三個方法是add_curve, add_cir

一、Sketchup用ruby進行開發--簡述

       首先我想說一下進行《Sketchup用ruby進行二次開發》的專欄的原因。        我的研究生論文是基於GIS的三維地下管線研究與實現,但是經過一段時間的學習,發現使用arcEngine和sketchup進行建模,不是很靠譜,原因是管線的數量有上萬條之

、Sketchup用ruby進行開發--Sketchup轉換操作符

我這裡有一張表,講Sketchup轉換操作符的用法。 第一條表示:2.54釐米(cm)=1 英寸 ( Inches )。     在Sketchup內部儲存長度使用的事英制,即使你在選擇模板使用的是米或是毫米。基於這個原因,下面這個表才顯得尤為重要,它可以方便在英制與公制或

六、Sketchup用ruby進行開發--建立球體

本節是複習上節講到的followme方法,下面看看用followme方法畫球形。 #============建立球體============== ents = Sketchup.active_model.entities # 建立一個正向為(0,0,1)的圓面 cent

七、Sketchup用ruby進行開發--利用Transformation實現Move工具(平移、旋轉和縮放)

 在Sketchup中,move工具使用的非常廣泛,,可以移動、拉伸和複製幾何體,也可以用來旋轉元件。舉一個簡單地例子。 我們要做一個建築物的尖頂,如下圖所示,就是使用move工具實現的。                   接下來我們就要學習如何使用ruby實現這樣的功能

三、Sketchup用ruby進行開發--實體類和構件圖類

    實體類是所有可畫圖形的子類,如下圖所示。實體類的主要子類是構件圖類,構件圖類是我們今後重點學習的類,包括Image、Text、Edge、Face、Group、Component Definition和Component Instance。下面對這兩個類做簡要說明。

【git】基於github開源平臺的專案進行開發

1.安裝git服務: https://blog.csdn.net/oqqHun123/article/details/85791425   2.開啟github官網: https://github.com/   3.輸入自己需要檢索的關鍵字 注:adm

CrashMonkey4Android-如何進行開發

如何進行二次開發 下載原始碼 我們可以開發的原始碼分兩部分,這個我在cts專輯中也講過,cts分兩部分,一個是基礎庫,一個是執行庫,所以我們的原始碼也分為兩部分 執行庫 同步CrashMonkey4Android原始碼: https://git

PIXHAWK進行開發

有改動的話,自己再研究研究吧(後面換cmake編譯方式了,改動蠻大)。 既然要做開發,第一步就是搭好開發環境,根據我的經驗,最好是在linux環境下編譯,這樣效率會很快,以前在windows下編譯,經常40分鐘以上,這樣就太影響開發了; 第二步,大概瞭解下韌體的架構,&amp;lt;img src="

ArcGIS10.2在VS2010/VS2012/VS2013 下進行開發及編譯出錯解決

平臺:VS2010、VS2012、VS2013 + ArcGIS 10.2 + Win7 64bit 使用ArcGIS10.2結合MFC進行二次開發,編譯出錯。 首先配置工程,在工程上右鍵->

control-m中 利用 bmc 公司提供的api 進行開發 介紹

API功能介紹 Control-M提供了使用者進行二次開發包,支援JAVA程式設計,使用者能根據自己需要通過API進行開發,該API只支援使用者編寫自己的Control-M/EM客戶端,編寫自己的介面給Control-M/EM服務端傳送各種請求。因為API只是與Control

jmeterjava請求開發

說明與步驟 原則上jmeter的java請求,可以壓測一切可使用java訪問的東西,包括Redis,MQ等等。 需要lib/ext中的ApacheJMeter_core.jar,如擴充套件java請求則還需要ApacheJMeter_java.jar,擴充套

kettle外掛開發

先把環境搭建好,這裡可以參考我之前的部落格,或者比較好的參考文獻: 原理部分: 轉換外掛開發: kettle轉換步驟外掛至少需要實現四個介面: org.pentaho.di.trans.step.StepInterface 負責資料處理,轉換和流轉。這裡面主要

java語言對arcgis進行開發

本文章是在已安裝arcgis(最好是完整版,在ArcGIS_Desktop資料夾下面含有SDK_java,並保證其已安裝)並且javaJDK已安裝且環境變數都已經配置好的前提下適用,具體怎麼安裝去網上搜吧有很多相關教程。(由於SDK_java只支援32JDK,所以請保證你的