java调用kettle api 制作转换-- 表输入输出

最近再使用kettle api 做一些东西,在这个栏目记录一下

用kettle来完成如图所示的样例 表输入->表输出

请添加图片描述

样例分析:

​ 如图所示,我们需要 一个连接源(输入对象和输出对象使用了同一个源)、一个表输入对象、一个表输出对象、一个hop对象

代码:
使用的jar包:具体jar包获取可以参考这里编译获取https://blog.csdn.net/weixin_43889494/article/details/132211256?spm=1001.2014.3001.5501
在这里插入图片描述

1.初始化kettle环境(非常重要)

KettleEnvironment.init();

请添加图片描述

2.数据源,这里数据源使用了常规jdbc url,驱动,账号,密码形式,一般使用国产化关系型数据库用这个即可

static final String SOURCE_DB_NAME = "源数据库";
static final String SOURCE_DB_USER = "";
static final String SOURCE_DB_PASS = "Y@1234";
static final String SOURCE_DB_URL = "jdbc:mysql://192.168.10.105:/mysql;
static final String SOURCE_DB_DRIVER = "com.mysql.cj.jdbc.Driver";
DatabaseMeta sourceMeta = new DatabaseMeta();
sourceMeta.setAccessType(DatabaseMeta.getAccessType("Native"));
sourceMeta.setDatabaseType("GENERIC");
sourceMeta.setUsername(SOURCE_DB_USER);
sourceMeta.setPassword(SOURCE_DB_PASS);
sourceMeta.setName(SOURCE_DB_NAME);
Properties sourceProperties = new Properties();
sourceProperties.setProperty("CUSTOM_URL", SOURCE_DB_URL);
//引入驱动依赖或jar包即可
sourceProperties.setProperty("CUSTOM_DRIVER_CLASS", SOURCE_DB_DRIVER);
sourceProperties.setProperty("FORCE_IDENTIFIERS_TO_LOWERCASE", "N");
sourceProperties.setProperty("FORCE_IDENTIFIERS_TO_UPPERCASE", "N");
sourceMeta.setAttributes(sourceProperties);
//连接测试
String testInfo = sourceMeta.testConnection();

3.表输入表输出

请添加图片描述

扫描二维码关注公众号,回复: 17029641 查看本文章
// 插件在画布的位置
Point point = new Point(100, 100);
//表输入
TableInputMeta tableInputMeta = new TableInputMeta();
tableInputMeta.setDatabaseMeta(sourceMeta);
tableInputMeta.setSQL("select `id`,`tel`,`email`,`bank_id`,`name`,`h_no`,`h_ano`,`shuihao`,`com`,`com_no`,`phone`,`aomen`,`ip`,`idcard`,`addr`,`date`,`c_no`,`rmb`,`num_2`,`vin`,`zc`,`addnew`,`wz`,`completely`,`single`,`sh`,`sw`,`jg`,`mac`,`hg_no`,`huix`,`ydsbm`,`ga_no`,`eg_name`,`eg_addr`,`ftmz`,`tid` from `aliyu_kettle_tran_source`.`sensitive_table1`");
// 获取注册插件的id,这里的id类似于策略模式,进行任务分发
String tableInputPluginId = PluginRegistry.getInstance().getPluginId(StepPluginType.class, tableInputMeta);
StepMeta tableInputStepMeta = new StepMeta(tableInputPluginId, TABLE_INPUT_NMAE, tableInputMeta);
tableInputStepMeta.setDraw(true);
tableInputStepMeta.setLocation(point);
//表输出
TableOutputMeta tableOutputMeta = new TableOutputMeta();
tableOutputMeta.setDatabaseMeta(sourceMeta);
tableOutputMeta.setSchemaName("aliyu_kettle_tran_target");
tableOutputMeta.setTableName("sensitive_table1");
tableOutputMeta.setCommitSize(1);
tableOutputMeta.setTruncateTable(false);
tableOutputMeta.setIgnoreErrors(true);
tableOutputMeta.setUseBatchUpdate(true);
//指定数据库字段,流里的字段和数据库字段做对比
tableOutputMeta.setSpecifyFields(true);
tableOutputMeta.setTableNameInTable(false);
//数据库中的字段,这里会拼接insert sql
tableOutputMeta.setFieldDatabase("`id`,`tel`,`email`,`bank_id`,`name`,`h_no`,`h_ano`,`shuihao`,`com`,`com_no`,`phone`,`aomen`,`ip`,`idcard`,`addr`,`date`,`c_no`,`rmb`,`num_2`,`vin`,`zc`,`addnew`,`wz`,`completely`,`single`,`sh`,`sw`,`jg`,`mac`,`hg_no`,`huix`,`ydsbm`,`ga_no`,`eg_name`,`eg_addr`,`ftmz`,`tid`".split(","));
//上一个步骤,数据流中的字段
tableOutputMeta.setFieldStream("id,tel,email,bank_id,name,h_no,h_ano,shuihao,com,com_no,phone,aomen,ip,idcard,addr,date,c_no,rmb,num_2,vin,zc,addnew,wz,completely,single,sh,sw,jg,mac,hg_no,huix,ydsbm,ga_no,eg_name,eg_addr,ftmz,tid".split(","));
String tableOutputPluginId = PluginRegistry.getInstance().getPluginId(StepPluginType.class, tableOutputMeta);
StepMeta tableOutputStepMeta = new StepMeta(tableOutputPluginId, TABLE_OUTPUT_NMAE, tableOutputMeta);
tableOutputStepMeta.setDraw(true);
tableOutputStepMeta.setLocation(point);
  1. 执行转换
TransMeta transMeta = new TransMeta();
transMeta.setName("trans");
transMeta.addDatabase(sourceMeta);
transMeta.addStep(tableInputStepMeta);
transMeta.addStep(tableOutputStepMeta);
//建立连接 hop 表输入->表输出
transMeta.addTransHop(new TransHopMeta(tableInputStepMeta, tableOutputStepMeta));
//打印ktr脚本,可以放在kettle工具执行
FileOut.writeFile("yous file path", transMeta);
Trans trans = new Trans(transMeta);
trans.execute(null);
trans.waitUntilFinished();
  1. 工具类
public class FileOut {
    
    
    public static void writeFile(String path, TransMeta transMeta, DefaultAcquisitionTransXml<AbstractMeta> defaultData){
    
    
        try{
    
    
            Files.write(Paths.get(path),defaultData.getAddXmlStep(transMeta).getBytes());
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }
    public static void writeFile(String path, TransMeta transMeta){
    
    
        try {
    
    
            writeFile(path,transMeta,(tm)-> DefaultAcquisitionTransXml.XML_HEAD+"\n"+tm.getXML());
            System.out.printf("转换元 %s 打印成功(覆盖性打印)", transMeta.getName());
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }
}
@FunctionalInterface
public interface DefaultAcquisitionTransXml<T extends AbstractMeta> {
    
    
     String XML_HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
     String getAddXmlStep(T transMeta) throws KettleException;
}

猜你喜欢

转载自blog.csdn.net/weixin_43889494/article/details/132168551