目錄
-
環境
Eclipse, jdk8,window10
-
工程搭建
-
引入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>
-
引入輔助包
輔助包就是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;
-
代碼分析
-
初始話kettle環境
很重要,否則有時候會有一些莫名其妙錯誤
// 初始化Kettle環境
KettleEnvironment.init();
EnvUtil.environmentInit();
-
定義數據庫信息
此處有兩種方法,一種是使用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() {
}
}