• kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件


    新版长期维护文档

          该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义功能的实现改为在eclipse等ide中开发。

          设计本插件的原因是直接在kettle中写java代码是很不容易的事,开发体验与eclipse差得远,java语法还要受到限制,调试麻烦。实现点简单的逻辑还行,稍微复杂一点就比较麻烦,需要对java和kettle相关接口很熟悉。而简单的功能可以采用javascript脚本实现,复杂的功能一般人很难直接在自定义java类控件中编写java实现。

          有人说可以每次直接开发新插件,虽然说java的插件机制还是很不错的,但开发一个插件还是没那么容易的,需要设计元数据,插件件功能实现,插件操作界面设计等,其中操作界面的调整是我最不愿意花时间的,慢慢调我也能调出常见控件的配置界面,但我觉得没必要,所以要实现一个完善的插件需要做的事情还是很多的。

          而本插件综合了以上两种机制,既有自定义java类的简单性,直接编写核心业务代码,操作界面统一使用一个JSON对象作为参数设置途径,所以基于此开发功能,只需继承一个基类而编写一个功能实现类就可以了;又有直接开发插件的便捷性,只需将相关的jar包作为用户类库导入项目,创建一个类,继承基类,就可以在eclipse中尽情的编写你的业务代码了。

          该插件已经作为我的另一个开源项目kettle管理平台(http://www.cnblogs.com/majinju/p/5739820.html)的一个子项目开源,相关代码可以从github上那个项目中获取,下面介绍下基于该插件开发实现自己业务的插件。

    1. 在eclipse中创建用户类库ku,到kettle管理平台项目介绍的博文中下载0.1.0版部署包,然后将部署包的lib目录中的jar全部加入。
    2. 在eclipse中创建一个java项目,添加上一步创建的用户类库到构建路径,然后新建一个java类,以下是转换步骤实现代码样例。
    /**
    * Project Name:KettleUtil
    * Date:2016年6月29日
    * Copyright (c) 2016, jingma All Rights Reserved.
    */
    
    package net.oschina.kettleutil.utilrun;
    
    import net.oschina.kettleutil.KettleUtilRunBase;
    import net.oschina.mytuils.KettleUtils;
    
    import org.pentaho.di.core.row.RowMetaInterface;
    import org.pentaho.di.core.row.ValueMeta;
    import org.pentaho.di.core.variables.VariableSpace;
    import org.pentaho.di.trans.TransMeta;
    import org.pentaho.di.trans.step.StepMeta;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * kettle util 运行示例<br/>
     * date: 2016年6月29日 <br/>
     * @author jingma
     * @version 
     */
    public class KurDemo extends KettleUtilRunBase{
        /**
        * 具体处理每一行数据
        * @see net.oschina.kettleutil.KettleUtilRunBase#disposeRow(java.lang.Object[])
        */
        @Override
        protected void disposeRow(Object[] outputRow) {
            //设置JOB名称
            outputRow[getFieldIndex("JOB_NAME")] = KettleUtils.getRootJobName(ku);
        }
        /**
        * 
        * @see net.oschina.kettleutil.KettleUtilRunBase#init()
        */
        @Override
        protected void init() {
            ku.logBasic("初始化插件");
        }
        /**
        * 
        * @see net.oschina.kettleutil.KettleUtilRunBase#end()
        */
        @Override
        protected void end() {
            ku.logBasic("数据处理结束");
        }
    
        /**
         * 
         * @see net.oschina.kettleutil.KettleUtilRunBase#getDefaultConfigInfo(org.pentaho.di.trans.TransMeta, java.lang.String)
         */
         @Override
         public String getDefaultConfigInfo(TransMeta transMeta, String stepName) throws Exception{
            //创建一个JSON对象,用于构建配置对象,避免直接拼字符串构建JSON字符串
            JSONObject params = new JSONObject();
            //设置一个参数key1
            params.put("key1", "");
            RowMetaInterface fields = transMeta.getPrevStepFields(stepName);
            if(fields.size()==0){
                throw new RuntimeException("没有获取到上一步骤的字段,请确认连接好上一步骤");
            }
            params.put("PrevInfoFields", fields.toString());
            //创建一个JSON数组对象,用于存放数组参数
            JSONArray arr = new JSONArray();
            arr.add("arr1");
            arr.add("arr2");
            params.put("array", arr);
            //生成的参数样例
            //{
            //  "array":[
            //          "arr1",
            //          "arr2"
            //  ],
            //  "key1":""
            //}
            //返回格式化后的默认JSON配置参数,供使用者方便快捷的修改配置
            return JSON.toJSONString(params, true);
        }
        
        public void getFields(RowMetaInterface r, String origin, RowMetaInterface[] info, StepMeta nextStep, VariableSpace space) {
            //添加输出到下一步的字段
            addField(r,"JOB_NAME",ValueMeta.TYPE_STRING,ValueMeta.TRIM_TYPE_BOTH,origin,"JOB名称");
        }
    }

      3. 以下是作业实体插件实现样例

    /**
    * Project Name:KettleUtil
    * Date:2016年6月29日
    * Copyright (c) 2016, jingma All Rights Reserved.
    */
    
    package net.oschina.kettleutil.utilrun;
    
    import net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunBase;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * job entry kettle util 运行示例<br/>
     * date: 2016年6月29日 <br/>
     * @author jingma
     * @version 
     */
    public class JeurDemo extends JobEntryKettleUtilRunBase{
    
        /**
        * 
        * @see net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunBase#run()
        */
        @Override
        protected boolean run() throws Exception {
            //这里写自己的业务
            jeku.logBasic(jeku.getConfigInfo());
            jeku.logBasic(configInfo.toJSONString());
            return true;
        }
    
        /**
         * 
         * @see net.oschina.kettleutil.KettleUtilRunBase#getDefaultConfigInfo(org.pentaho.di.trans.TransMeta, java.lang.String)
         */
         @Override
         public String getDefaultConfigInfo() throws Exception{
            //创建一个JSON对象,用于构建配置对象,避免直接拼字符串构建JSON字符串
            JSONObject params = new JSONObject();
            //设置一个参数key1
            params.put("key1", "");
            //创建一个JSON数组对象,用于存放数组参数
            JSONArray arr = new JSONArray();
            arr.add("arr1");
            arr.add("arr2");
            params.put("array", arr);
            //生成的参数样例
            //{
            //  "array":[
            //          "arr1",
            //          "arr2"
            //  ],
            //  "key1":""
            //}
            //返回格式化后的默认JSON配置参数,供使用者方便快捷的修改配置
            return JSON.toJSONString(params, true);
    //         return "select *
     from dual";
        }
    }

         4. 开发完成后,打包放入kettle lib中,重启kettle。以下是该插件配置界面,可以修改步骤名称,在类名称处填写你的实现类的完整类路径,然后就可以点击【获取默认配置】按钮,获取你配置的实现类对应的配置信息,根据需要修改即可完成配置。以下分别是转换的插件实现示例和作业实体实现示例截图。

      以上就完成了基于该插件的开发使用工作,由上可以看出,执行编写一个类,就可以完成一个插件的开发工作。

  • 相关阅读:
    Oracle 10g R2 Transparent Data Encryption 透明数据加密
    Spark之Task原理分析
    一个Spark job的生命历程
    Spark调优秘诀——超详细
    NLP文本相似度(TF-IDF)
    Spark 参数配置的几种方法
    Spark提交应用程序之Spark-Submit分析
    spark_flume_mysql 整合
    Spark Programming Guide《翻译》
    windows下Idea结合maven开发spark和本地调试
  • 原文地址:https://www.cnblogs.com/majinju/p/5767046.html
Copyright © 2020-2023  润新知