使用Kettle編寫抽取數據

目錄

環境

工程搭建

引入kettle的jar包

引入輔助包

 3. 添加mysql連接jar包

4. 添加lombok包

創建數據庫和表

代碼分析

初始話kettle環境

定義數據庫信息

    3. mysql處理

   4. 生成表輸入

5. 設置查詢SQL

6. 將操作添加到步驟中

7. 選擇字段

8. 將操作添加到步驟

9.  將步驟串聯起來

10. 字符串替換

11. 將結果變爲json字符串

12. 將記錄變爲結果

13. 替換SQL中變量

14 設置執行參數,添加監聽

15. 執行抽取

16. 獲取執行結果

17. 打印輸出

18. 前置參數準備,僅用於測試

完整樣例

DatabaseConn.java

ExtractBean.java

FieldTransfer.java

測試類


  • 環境

Eclipse, jdk8,window10

  • 工程搭建

  1. 引入kettle的jar包

    <kettle.version>5.1.0.0-752</kettle.version>
    <dependency>
    			<groupId>pentaho-kettle</groupId>
    			<artifactId>kettle-engine</artifactId>
    			<version>${kettle.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>pentaho-kettle</groupId>
    			<artifactId>kettle-core</artifactId>
    			<version>${kettle.version}</version>
    		</dependency>
  2. 引入輔助包

輔助包就是Kettle中可能使用到的

<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>commons-vfs</groupId>
			<artifactId>commons-vfs</artifactId>
			<version>20100924-pentaho</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>com.googlecode.json-simple</groupId>
			<artifactId>json-simple</artifactId>
			<version>1.1.1</version>
		</dependency>

 3. 添加mysql連接jar包

<dependency>
	   <groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.44</version>
		</dependency>

4. 添加lombok包

lombok是一款生成getter,settter的包,很方便,eclipse還需要安裝插件來編譯生成getter,setter

<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.0</version>
		</dependency>
  • 創建數據庫和表

Create database test;
創建數據來源表:
CREATE TABLE `etl_src_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `mail` varchar(40) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

創建目標表:
CREATE TABLE `etl_dest_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `mail` varchar(40) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 代碼分析

  1. 初始話kettle環境

    很重要,否則有時候會有一些莫名其妙錯誤

    // 初始化Kettle環境

    KettleEnvironment.init();

    EnvUtil.environmentInit();

  2. 定義數據庫信息

    此處有兩種方法,一種是使用XML,一種構造方法傳參

        A)  xml格式定義一個xml報文

/**
     * 數據庫連接信息,適用於DatabaseMeta其中 一個構造器DatabaseMeta(String xml)
     */
	protected String databasesXML = 
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			+ "<connection>"
			+ "<name>{0}</name>"
			+ "<server>{1}</server>"
			+ "<type>{2}</type>"
			+ "<access>{3}</access>"
			+ "<database>{4}</database>"
			+ "<port>{5}</port>"
			+ "<username>{6}</username>"
			+ "<password>{7}</password>"
			+ "</connection>";

然後將值放入

//添加轉換的數據庫連接
        String xml = MessageFormat.format(databasesXML, new Object[] {
        		srcDBName,
        		srcDB.getServer(),
        		"MySQL",
        		"Native",
        		srcDB.getDatabase(),
        		srcDB.getPort(),
        		srcDB.getUsername(),
        		srcDB.getPassword()
        });
		DatabaseMeta dbMeta = new DatabaseMeta(xml);

 B) 傳參方式

final String srcDBName = "srcDB";
		DatabaseMeta dbMeta = new DatabaseMeta(srcDBName, srcDB.getType(),
				srcDB.getAccess(), srcDB.getServer(), srcDB.getDatabase(),
				srcDB.getPort(), srcDB.getUsername(), srcDB.getPassword());

    3. mysql處理

其他數據庫可以跳過,爲了防止數據庫字段查詢出來亂碼問題

dbMeta.setConnectSQL(MessageFormat.format("set names ''{0}'';",

new Object[] { "utf8" }));

因爲mysql數據庫是,數據庫編碼,字段編碼,每個字段編碼可以不同。

 

   4. 生成表輸入

 

TableInputMeta tableInputMeta = new TableInputMeta();
		String tableInputPluginId = registry.getPluginId(StepPluginType.class,
				tableInputMeta);
		// 給表輸入添加一個DatabaseMeta連接數據庫
		tableInputMeta.setDatabaseMeta(transMeta.findDatabase(srcDBName));

5. 設置查詢SQL

// 構造查詢SQL
		String selectSql = "select {0} from {1}";
		selectSql = MessageFormat.format(
				selectSql,
				new Object[] {
						StringUtils.join(extractBean.getSrcFields(), ","),
						extractBean.getSrcTable()[0] });
		tableInputMeta.setSQL(selectSql);

上述SQL語句有{0},{1}這種變量,所以還需要設置替換SQL中變量

// 替換SQL語句中變量

tableInputMeta.setVariableReplacementActive(true);

 

6. 將操作添加到步驟中

只有將操作添加到步驟中才可以,這樣才能形成一個流程,操作就是流程中的一個節點,和工作流相似。

// 將TableInputMeta添加到轉換中
		StepMeta tableInputStepMeta = new StepMeta(tableInputPluginId,
				"tableInput", (StepMetaInterface) tableInputMeta);
		transMeta.addStep(tableInputStepMeta);

7. 選擇字段

選擇你要獲取的字段信息,雖然在sql中設置了查詢字段,但是此處是獲取查詢字段中要獲取數據的字段。

相當於查詢出name,age,address,phone,sex等個人信息,但是某個流程只需要name即可。

// 字段選擇
		SelectValuesMeta selectValuesMeta = new SelectValuesMeta();
		String selectValuesPluginId = registry.getPluginId(
				StepPluginType.class, selectValuesMeta);
		selectValuesMeta.allocate(extractBean.getSrcFields().length, 0, 0);
		selectValuesMeta.setSelectName(extractBean.getSrcFields());

8. 將操作添加到步驟

StepMeta selectValuesStepMeta = new StepMeta(selectValuesPluginId,
				"selectValues", (StepMetaInterface) selectValuesMeta);
		transMeta.addStep(selectValuesStepMeta);

9.  將步驟串聯起來

步驟串聯起來,就相當於與工作流程中前一個節點到下一個節點那個箭頭連線

// 添加hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(tableInputStepMeta,
				selectValuesStepMeta));

10. 字符串替換

將獲取到的內容匹配要替換的字符串,替換爲目標字符串。其實就是數據脫敏。

// 字符串替換
		ReplaceStringMeta replaceStringMeta = new ReplaceStringMeta();
		String replaceStringPluginId = registry.getPluginId(
				StepPluginType.class, replaceStringMeta);
		int fieldTransferLength = extractBean.getFieldTransfers().length;
		replaceStringMeta.allocate(fieldTransferLength);
		for (int i = 0; i < fieldTransferLength; i++) {
			FieldTransfer fieldTransfer = extractBean.getFieldTransfers()[i];
			replaceStringMeta.getFieldInStream()[i] = fieldTransfer.getField();
			replaceStringMeta.getReplaceString()[i] = fieldTransfer.getSrc();
			replaceStringMeta.getReplaceByString()[i] = fieldTransfer
					.getTarget();
			//是否使用正則表達式
			replaceStringMeta.getUseRegEx()[i] = fieldTransfer.isRegEx() ? 1
					: 0;
		}

		if (extractBean.getFieldTransfers() == null || fieldTransferLength <= 0) {
			replaceStringMeta.allocate(0);
		}

11. 將結果變爲json字符串

outputFields[i] = field; 當初因爲少了這麼一段而在底層kettle中一直報空指針異常。

// json輸出
		JsonOutputMeta jsonOutput = new JsonOutputMeta();
		String jsonOutputPluginId = registry.getPluginId(StepPluginType.class,
				jsonOutput);
		jsonOutput.setOperationType(JsonOutputMeta.OPERATION_TYPE_OUTPUT_VALUE);
		jsonOutput.setJsonBloc("data");
		jsonOutput.setOutputValue("rows");

		int srcFieldLength = extractBean.getSrcFields().length;
		JsonOutputField[] outputFields = new JsonOutputField[srcFieldLength];
		for (int i = 0; i < srcFieldLength; i++) {
			JsonOutputField field = new JsonOutputField();
			field.setFieldName(extractBean.getSrcFields()[i]);
			field.setElementName(extractBean.getSrcFields()[i]);
			
			outputFields[i] = field;
		}
		jsonOutput.setOutputFields(outputFields);

12. 將記錄變爲結果

將Json輸出變爲要返回給用戶的結果。

// 複製記錄到結果
		RowsToResultMeta rowsToResultMeta = new RowsToResultMeta();
		String rowsToResultMetaPluginId = registry.getPluginId(
				StepPluginType.class, rowsToResultMeta);
		// 添加步驟到轉換中
		StepMeta rowsToResultStepMeta = new StepMeta(rowsToResultMetaPluginId,
				"rowsToResult", (StepMetaInterface) rowsToResultMeta);
		transMeta.addStep(rowsToResultStepMeta);
		// hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(jsonOutputStepMeta,
				rowsToResultStepMeta));

13. 替換SQL中變量

這也是爲什麼要在之前設置替換SQL中變量那個參數

tableInputMeta.setVariableReplacementActive(true);

transMeta.setVariable("VAR_FROM", "0");
		transMeta.setVariable("VAR_TO", "20");

14 設置執行參數,添加監聽

Trans trans = new Trans(transMeta);
		trans.setMonitored(true);
		trans.setInitializing(true);
		trans.setPreparing(true);
		trans.setLogLevel(LogLevel.BASIC);
		trans.setRunning(true);
		trans.setSafeModeEnabled(true);

		trans.addTransListener(new TransAdapter() {
			@Override
			public void transFinished(Trans trans) {
				System.out.println("轉換執行完成");
			}
		});

15. 執行抽取

try {
			// trans.startThreads();
			trans.execute(null);
		} catch (KettleException e) {
			e.printStackTrace();
		}
		trans.waitUntilFinished();
		if (trans.getErrors() > 0) {
			System.out.println("抽取數據出錯.");
			return;
		}

16. 獲取執行結果

Result result = trans.getResult();

17. 打印輸出

List<RowMetaAndData> list = result.getRows();
		String fieldNames = "";
		if (list != null && list.size() > 0) {
			RowMetaAndData row = list.get(0);
			RowMetaInterface rowMeta = row.getRowMeta();
			Object[] srcFields = ArrayUtils.subarray(rowMeta.getFieldNames(),
					0, this.extractBean.getSrcFields().length);
			fieldNames = StringUtils.join(srcFields, ",");

			Object[] cols = row.getData();
			// 遍歷方式獲取
			String json = "{}";
			for (int i = 0; i < cols.length; i++) {
				if (cols[i] != null) {
					json = cols[i].toString();
					break;
				}
			}
			System.out.println("抽取數據爲:" + json);
		}

18. 前置參數準備,僅用於測試

// 初始化數據源表和目標表數據
		ExtractBean extractBean = new ExtractBean();
		DatabaseConn srcDB = new DatabaseConn();
		srcDB.setDatabase("test");
		srcDB.setServer("127.0.0.1");
		srcDB.setPort("3306");
		srcDB.setUsername("root");
		srcDB.setPassword("root");
		srcDB.setType("MySQL");
		extractBean.setSrcDB(srcDB);
		extractBean
				.setSrcFields(new String[] { "name", "age", "mail", "phone" });
		extractBean.setSrcPk(new String[] { "id" });
		extractBean.setSrcTable(new String[] { "etl_src_table" });

		// 數據轉換
		FieldTransfer[] fieldTransfers = new FieldTransfer[2];
		FieldTransfer nameTransfer = new FieldTransfer();
		nameTransfer.setField("name");
		nameTransfer.setSrc("king");
		nameTransfer.setTarget("lw");
		fieldTransfers[0] = nameTransfer;
		FieldTransfer mailTransfer = new FieldTransfer();
		mailTransfer.setField("mail");
		mailTransfer.setSrc("^lw.*@.*//.com$");
		mailTransfer.setTarget("lw***.com");
		mailTransfer.setRegEx(true);
		fieldTransfers[1] = mailTransfer;
		extractBean.setFieldTransfers(fieldTransfers);

		DatabaseConn destDB = new DatabaseConn();
		destDB.setDatabase("test");
		destDB.setServer("127.0.0.1");
		destDB.setPort("3306");
		destDB.setUsername("root");
		destDB.setPassword("root");
		destDB.setType("MySQL");
		extractBean.setDestDB(destDB);
		extractBean
				.setDestFields(new String[] { "name", "age", "mail", "phone" });
		extractBean.setDestPk(new String[] { "id" });
		extractBean.setDestTable("etl_dest_table");
		this.extractBean = extractBean;
  • 完整樣例

DatabaseConn.java

package com.lw.kettle;

import lombok.Data;

@Data
public class DatabaseConn {

	/** 數據庫服務器IP地址 */
	private String server;

	/** 數據庫類型 */
	private String type;

	/** 訪問類型(Native,ODBC,JNDI) */
	private String access = "Native";

	/** 數據庫名稱 */
	private String database;

	/** 連接端口 */
	private String port;

	/** 連接用戶名 */
	private String username;

	/** 連接密碼 */
	private String password;

}

ExtractBean.java

package com.lw.kettle;

import lombok.Data;

@Data
public class ExtractBean {

	/**
	 * 源表數據庫連接
	 */
	private DatabaseConn srcDB;

	/**
	 * 源表表名
	 */
	private String[] srcTable = new String[0];

	/**
	 * 源表交換字段類型
	 */
	private String[] srcFields;

	/**
	 * 源表主鍵
	 */
	private String[] srcPk;

	/**
	 * 目標表的數據庫配置
	 */
	private DatabaseConn destDB;

	/**
	 * 目標表
	 */
	private String destTable;

	/**
	 * 目標表字段
	 */
	private String[] destFields;

	/**
	 * 目標表主鍵
	 */
	private String[] destPk;
	
	/**
	 * 數據轉換
	 */
	private FieldTransfer[] fieldTransfers;
}

FieldTransfer.java

package com.lw.kettle;

import lombok.Data;


/**
 * 字段轉換類
 * 
 * @author lenovo
 *
 */
@Data
public class FieldTransfer {

	private String field;

	private String src;

	private String target;

	private boolean regEx = false;
}

測試類

package com.lw.kettle;

import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.Result;
import org.pentaho.di.core.RowMetaAndData;
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.logging.LogLevel;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransAdapter;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.steps.jsonoutput.JsonOutputField;
import org.pentaho.di.trans.steps.jsonoutput.JsonOutputMeta;
import org.pentaho.di.trans.steps.replacestring.ReplaceStringMeta;
import org.pentaho.di.trans.steps.rowstoresult.RowsToResultMeta;
import org.pentaho.di.trans.steps.selectvalues.SelectValuesMeta;
import org.pentaho.di.trans.steps.tableinput.TableInputMeta;

public class CopyTable {

	ExtractBean extractBean = new ExtractBean();

	@Before
	public void before() {
		try {
			// 初始化Kettle環境
			KettleEnvironment.init();
			EnvUtil.environmentInit();
		} catch (KettleException e) {
			e.printStackTrace();
		}

		// 初始化數據源表和目標表數據
		ExtractBean extractBean = new ExtractBean();
		DatabaseConn srcDB = new DatabaseConn();
		srcDB.setDatabase("test");
		srcDB.setServer("127.0.0.1");
		srcDB.setPort("3306");
		srcDB.setUsername("root");
		srcDB.setPassword("root");
		srcDB.setType("MySQL");
		extractBean.setSrcDB(srcDB);
		extractBean
				.setSrcFields(new String[] { "name", "age", "mail", "phone" });
		extractBean.setSrcPk(new String[] { "id" });
		extractBean.setSrcTable(new String[] { "etl_src_table" });

		// 數據轉換
		FieldTransfer[] fieldTransfers = new FieldTransfer[2];
		FieldTransfer nameTransfer = new FieldTransfer();
		nameTransfer.setField("name");
		nameTransfer.setSrc("king");
		nameTransfer.setTarget("lw");
		fieldTransfers[0] = nameTransfer;
		FieldTransfer mailTransfer = new FieldTransfer();
		mailTransfer.setField("mail");
		mailTransfer.setSrc("^lw.*@.*//.com$");
		mailTransfer.setTarget("lw***.com");
		mailTransfer.setRegEx(true);
		fieldTransfers[1] = mailTransfer;
		extractBean.setFieldTransfers(fieldTransfers);

		DatabaseConn destDB = new DatabaseConn();
		destDB.setDatabase("test");
		destDB.setServer("127.0.0.1");
		destDB.setPort("3306");
		destDB.setUsername("root");
		destDB.setPassword("root");
		destDB.setType("MySQL");
		extractBean.setDestDB(destDB);
		extractBean
				.setDestFields(new String[] { "name", "age", "mail", "phone" });
		extractBean.setDestPk(new String[] { "id" });
		extractBean.setDestTable("etl_dest_table");
		this.extractBean = extractBean;
	}
	
	/**
     * 數據庫連接信息,適用於DatabaseMeta其中 一個構造器DatabaseMeta(String xml)
     */
	protected String databasesXML = 
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			+ "<connection>"
			+ "<name>{0}</name>"
			+ "<server>{1}</server>"
			+ "<type>{2}</type>"
			+ "<access>{3}</access>"
			+ "<database>{4}</database>"
			+ "<port>{5}</port>"
			+ "<username>{6}</username>"
			+ "<password>{7}</password>"
			+ "</connection>";

	/**
	 * 1. 源表和目標表全量交換
	 * @throws KettleXMLException 
	 */
	@Test
	public void copyTableTest() throws KettleXMLException {

		ExtractBean extractBean = CopyTable.this.extractBean;

		TransMeta transMeta = new TransMeta();
		transMeta.setName("全量抽取數據");

		DatabaseConn srcDB = extractBean.getSrcDB();
		final String srcDBName = "srcDB";
		DatabaseMeta dbMeta = new DatabaseMeta(srcDBName, srcDB.getType(),
				srcDB.getAccess(), srcDB.getServer(), srcDB.getDatabase(),
				srcDB.getPort(), srcDB.getUsername(), srcDB.getPassword());
		
		//添加轉換的數據庫連接
//        String xml = MessageFormat.format(databasesXML, new Object[] {
//        		srcDBName,
//        		srcDB.getServer(),
//        		"MySQL",
//        		"Native",
//        		srcDB.getDatabase(),
//        		srcDB.getPort(),
//        		srcDB.getUsername(),
//        		srcDB.getPassword()
//        });
//		DatabaseMeta dbMeta = new DatabaseMeta(xml);

		dbMeta.setConnectSQL(MessageFormat.format("set names ''{0}'';",
				new Object[] { "utf8" }));

		transMeta.addDatabase(dbMeta);

		PluginRegistry registry = PluginRegistry.getInstance();
		TableInputMeta tableInputMeta = new TableInputMeta();
		String tableInputPluginId = registry.getPluginId(StepPluginType.class,
				tableInputMeta);
		// 給表輸入添加一個DatabaseMeta連接數據庫
		tableInputMeta.setDatabaseMeta(transMeta.findDatabase(srcDBName));
		// 構造查詢SQL
		String selectSql = "select {0} from {1}";
		selectSql = MessageFormat.format(
				selectSql,
				new Object[] {
						StringUtils.join(extractBean.getSrcFields(), ","),
						extractBean.getSrcTable()[0] });
		tableInputMeta.setSQL(selectSql);

		// 打印查詢SQL
		System.out.println(selectSql);

		// 替換SQL語句中變量
		tableInputMeta.setVariableReplacementActive(true);

		// 將TableInputMeta添加到轉換中
		StepMeta tableInputStepMeta = new StepMeta(tableInputPluginId,
				"tableInput", (StepMetaInterface) tableInputMeta);
		transMeta.addStep(tableInputStepMeta);

		// 字段選擇
		SelectValuesMeta selectValuesMeta = new SelectValuesMeta();
		String selectValuesPluginId = registry.getPluginId(
				StepPluginType.class, selectValuesMeta);
		selectValuesMeta.allocate(extractBean.getSrcFields().length, 0, 0);
		selectValuesMeta.setSelectName(extractBean.getSrcFields());

		StepMeta selectValuesStepMeta = new StepMeta(selectValuesPluginId,
				"selectValues", (StepMetaInterface) selectValuesMeta);
		transMeta.addStep(selectValuesStepMeta);

		// 添加hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(tableInputStepMeta,
				selectValuesStepMeta));

		// 字符串替換
		ReplaceStringMeta replaceStringMeta = new ReplaceStringMeta();
		String replaceStringPluginId = registry.getPluginId(
				StepPluginType.class, replaceStringMeta);
		int fieldTransferLength = extractBean.getFieldTransfers().length;
		replaceStringMeta.allocate(fieldTransferLength);
		for (int i = 0; i < fieldTransferLength; i++) {
			FieldTransfer fieldTransfer = extractBean.getFieldTransfers()[i];
			replaceStringMeta.getFieldInStream()[i] = fieldTransfer.getField();
			replaceStringMeta.getReplaceString()[i] = fieldTransfer.getSrc();
			replaceStringMeta.getReplaceByString()[i] = fieldTransfer
					.getTarget();
			//是否使用正則表達式
			replaceStringMeta.getUseRegEx()[i] = fieldTransfer.isRegEx() ? 1
					: 0;
		}

		if (extractBean.getFieldTransfers() == null || fieldTransferLength <= 0) {
			replaceStringMeta.allocate(0);
		}

		// 添加步驟到轉換中
		StepMeta replaceStringStepMeta = new StepMeta(replaceStringPluginId,
				"replaceString", (StepMetaInterface) replaceStringMeta);
		transMeta.addStep(replaceStringStepMeta);
		// 添加hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(selectValuesStepMeta,
				replaceStringStepMeta));

		// json輸出
		JsonOutputMeta jsonOutput = new JsonOutputMeta();
		String jsonOutputPluginId = registry.getPluginId(StepPluginType.class,
				jsonOutput);
		jsonOutput.setOperationType(JsonOutputMeta.OPERATION_TYPE_OUTPUT_VALUE);
		jsonOutput.setJsonBloc("data");
		jsonOutput.setOutputValue("rows");

		int srcFieldLength = extractBean.getSrcFields().length;
		JsonOutputField[] outputFields = new JsonOutputField[srcFieldLength];
		for (int i = 0; i < srcFieldLength; i++) {
			JsonOutputField field = new JsonOutputField();
			field.setFieldName(extractBean.getSrcFields()[i]);
			field.setElementName(extractBean.getSrcFields()[i]);
			
			outputFields[i] = field;
		}
		jsonOutput.setOutputFields(outputFields);

		// 添加步驟到轉換中
		StepMeta jsonOutputStepMeta = new StepMeta(jsonOutputPluginId,
				"jsonOutput", (StepMetaInterface) jsonOutput);
		transMeta.addStep(jsonOutputStepMeta);
		// 添加hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(replaceStringStepMeta,
				jsonOutputStepMeta));

		// 複製記錄到結果
		RowsToResultMeta rowsToResultMeta = new RowsToResultMeta();
		String rowsToResultMetaPluginId = registry.getPluginId(
				StepPluginType.class, rowsToResultMeta);
		// 添加步驟到轉換中
		StepMeta rowsToResultStepMeta = new StepMeta(rowsToResultMetaPluginId,
				"rowsToResult", (StepMetaInterface) rowsToResultMeta);
		transMeta.addStep(rowsToResultStepMeta);
		// hop把兩個步驟關聯起來
		transMeta.addTransHop(new TransHopMeta(jsonOutputStepMeta,
				rowsToResultStepMeta));

		transMeta.setVariable("VAR_FROM", "0");
		transMeta.setVariable("VAR_TO", "20");

		Trans trans = new Trans(transMeta);
		trans.setMonitored(true);
		trans.setInitializing(true);
		trans.setPreparing(true);
		trans.setLogLevel(LogLevel.BASIC);
		trans.setRunning(true);
		trans.setSafeModeEnabled(true);

		trans.addTransListener(new TransAdapter() {
			@Override
			public void transFinished(Trans trans) {
				System.out.println("轉換執行完成");
			}
		});

		try {
			// trans.startThreads();
			trans.execute(null);
		} catch (KettleException e) {
			e.printStackTrace();
		}
		trans.waitUntilFinished();
		if (trans.getErrors() > 0) {
			System.out.println("抽取數據出錯.");
			return;
		}

		Result result = trans.getResult();
		List<RowMetaAndData> list = result.getRows();
		String fieldNames = "";
		if (list != null && list.size() > 0) {
			RowMetaAndData row = list.get(0);
			RowMetaInterface rowMeta = row.getRowMeta();
			Object[] srcFields = ArrayUtils.subarray(rowMeta.getFieldNames(),
					0, this.extractBean.getSrcFields().length);
			fieldNames = StringUtils.join(srcFields, ",");

			Object[] cols = row.getData();
			// 遍歷方式獲取
			String json = "{}";
			for (int i = 0; i < cols.length; i++) {
				if (cols[i] != null) {
					json = cols[i].toString();
					break;
				}
			}
			System.out.println("抽取數據爲:" + json);
		}

	}

	/**
	 * 2.建立臨時表和表觸發器
	 */
	@Test
	public void createTriggerAndTmpTable() {

	}

	/**
	 * 3.觸發器增量交換
	 */
	@Test
	public void changeWithTrigger() {

	}

	/**
	 * 4.時間戳交換
	 */
	@Test
	public void changeWithTime() {

	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章