1.本示例效果。
a.可以对两个库中结果相同的表进行数据迁移。
b.可选择性把源表的字段抽取到目标表。
c.一个模版即可完成一系列的数据抽取。
解决方案:
定义库表迁移流程,即,《表输入->表输出》可下载附件查看。
模版所需参数:
1.源表数据连接名称(模版文件中已经保存的连接),
2.源表抽取sql,
3.目标表连接。
4.目标表名称(事先创建好)。
5.抽取sql中要入库的字段数组。
6.目标表对应源表的字段数组。
示例具体代码:
package org.pentaho.di.trans; import java.util.List; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.Log4jFileAppender; import org.pentaho.di.core.logging.LogWriter; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.trans.steps.tableinput.TableInputMeta; import org.pentaho.di.trans.steps.tableoutput.TableOutputMeta; public class TestTransMain { public static void tableToTableSimpleTemplateDemo( String tableInputConneName, String sql, String tableOutConnneName, String dest_tablename,String [] streamFields,String [] tableOutFields) throws Exception { String filename = "D:\\etl_tem\\4.3测试流程\\表输入表输出模版.ktr"; String arguments[] = {}; try { TransMeta meta = new TransMeta(filename); DatabaseMeta tableInputDbMeta = null; DatabaseMeta tableoutDbMeta = null; List<DatabaseMeta> list = meta.getDatabases(); for(DatabaseMeta dbMeta : list) { if(dbMeta.getName().equals(tableInputConneName)) { tableInputDbMeta = dbMeta; } if(dbMeta.getName().equals(tableOutConnneName)) { tableoutDbMeta = dbMeta; } if(tableoutDbMeta!=null && tableInputDbMeta!=null) break; } if(tableoutDbMeta==null || tableInputDbMeta==null) { System.out.println("指定的数据源名称在模版文件中不存在!"); return ; } StepMeta stepMeta = meta.findStep("表输入"); TableInputMeta tableInput_meta = (TableInputMeta)stepMeta.getStepMetaInterface(); tableInput_meta.setDatabaseMeta(tableInputDbMeta); tableInput_meta.setSQL(sql); stepMeta = meta.findStep("表输出"); TableOutputMeta tableout_meta = (TableOutputMeta)stepMeta.getStepMetaInterface(); tableout_meta.setDatabaseMeta(tableoutDbMeta); tableout_meta.setTablename(dest_tablename); tableout_meta.setFieldStream(streamFields); tableout_meta.setFieldDatabase(tableOutFields); Trans trans = new Trans(meta); trans.prepareExecution(arguments); trans.addTransListener(new TransAdapter() { public void transFinished(Trans trans) throws KettleException { System.out.println("流程执行完成"); } }); trans.startThreads(); trans.waitUntilFinished(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String tableInputConneName = "153ora"; String sql = "SELECT ID, NAME, SEX FROM PERSON"; String tableOutConnneName = "153ora"; String dest_tablename = "TTT_Person"; String [] streamFields = {"ID","NAME","SEX"}; String [] tableOutFields = {"ID","NAME","SEX"}; try { KettleEnvironment.init(); Log4jFileAppender fileAppender = LogWriter.createFileAppender( "D:\\etl_tem\\4.3测试流程\\test.log", true); LogWriter.getInstance().addAppender(fileAppender); tableToTableSimpleTemplateDemo(tableInputConneName, sql, tableOutConnneName, dest_tablename, streamFields, tableOutFields); fileAppender.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("主函数结束"); } }