Java调用kettle的作业和转换

一、java调用转换

1.需要将kettle的jar包引入项目,单独的最小jar包在我的资源内有上传,本次测试环境中,将kettle中的所有jar包(lib文件夹下的所有jar包)均添加到了项目中。

代码部分:

        //初始化ketlle
        KettleEnvironment.init();
        TransMeta meta = new TransMeta("E:\\basic\\kettlet\\workspace\\1.ktr");
        Trans trans = new Trans(meta);
        trans.prepareExecution(null);
        trans.startThreads();
        trans.waitUntilFinished();
        if(trans.getErrors()==0){
            System.out.println("执行成功!");
        }

 

二、java调用job

1.也需要导入相同的jar包

代码部分

 KettleEnvironment.init();  
 JobMeta jobMeta = new JobMeta("E:\\basic\\kettlet\\workspace\\1.kjb",null);  
 Job job = new Job(null, jobMeta);  
 job.start();  
 job.waitUntilFinished();  

三、java创建转换

package test;

import java.io.File;

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.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;

public class CreateTran2 {
	 public static CreateTran2 transDemo;
	    
	    /**
	     * 两个库中的表名
	     */
	    public static String bjdt_tablename = "lwz";
	    public static String kettle_tablename = "TESTKETTLE";
	    public static final String[] databasesXML = {
	            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
	              "<connection>" +
	                "<name>连接名称</name>" +
	                "<server>数据库ip</server>" +
	                "<type>数据库种类</type>" +
	                "<access>连接类型</access>" + 
	                "<database>数据库的SID</database>" +
	                "<port>端口号</port>" +
	                "<username>账户</username>" +
	                "<password>密码</password>" +
	              "</connection>",
	              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
	              "<connection>" +
	                "<name>连接名称</name>" +
	                "<server>数据库ip</server>" +
	                "<type>数据库种类</type>" +
	                "<access>连接类型</access>" + 
	                "<database>数据库的SID</database>" +
	                "<port>端口号</port>" +
	                "<username>账户</username>" +
	                "<password>密码</password>" +
	              "</connection>"
	        };  

	    /**
	     * 生成一个转化,把一个数据库中的数据转移到另一个数据库中,只有两个步骤,第一个是表输入,第二个是表插入与更新操作
	     * @return
	     * @throws KettleXMLException 
	     */
	    public TransMeta generateMyOwnTrans() throws KettleXMLException{
	         
	        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 year, con1, CON2,CON3,CON4,AAA 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[]{"year"});
	        insertUpdateMeta.setKeyStream(new String[]{"year"});
	        insertUpdateMeta.setKeyStream2(new String[]{""});//一定要加上
	        insertUpdateMeta.setKeyCondition(new String[]{"="});
	         
	        //设置要更新的字段
	        String[] updatelookup = {"YEAR","CON1","CON2","CON3","CON4","AAA"} ;
	         String [] updateStream = {"YEAR","CON1","CON2","CON3","CON4","AAA"};
	         Boolean[] updateOrNot = {false,true,true,true,true,true,true};
	         insertUpdateMeta.setUpdateLookup(updatelookup);
	        insertUpdateMeta.setUpdateStream(updateStream);
	        insertUpdateMeta.setUpdate(updateOrNot);
	        String[] lookup = insertUpdateMeta.getUpdateLookup();
	        //System.out.println("******:"+lookup[1]);
	        //System.out.println("insertUpdateMetaXMl:"+insertUpdateMeta.getXML());
	        //添加步骤到转换中
	        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;
	    }
	    
	    
	    public static void main(String[] args) {
	        try {
	            KettleEnvironment.init();
	            transDemo = new CreateTran2();
	            TransMeta transMeta = transDemo.generateMyOwnTrans();
	            String transXml = transMeta.getXML();
	            //System.out.println("transXml:"+transXml);
	            String transName = "E:\\basic\\kettlet\\workspace\\copy-one-table.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;
	        }
	         
	    }
}

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值