kettle的javajava 让组件不被覆盖怎么去让一列数据分成几列

java程序中给Kettle传参数,其实很简单
前段时间让同事研究下kettle如何通过java方法传参数,回答说资料太少搞不定,心理不爽,今天上网搜了搜果然文章鱼龙混杂,最终发现,其实步骤很简单,标红的地方就是要注意的地方.代码例子是调用job的,自测正常,转换也是一个道理,但是没有试验.
org.pentaho.di.core.exception.KettleE
import org.pentaho.di.core.logging.LogW
import org.pentaho.di.core.util.EnvU
import org.pentaho.di.job.J
import org.pentaho.di.job.JobEntryL
import org.pentaho.di.job.JobM
import org.pentaho.di.trans.StepL
import org.pentaho.di.trans.T
import org.pentaho.di.trans.TransM
public class EtlParams {
&public static void main(String[] args) {
&&// TODO Auto-generated method
&&runJob("D:\\etl\\params1.kjb");
&public static void runJob(String filename)
StepLoader.init();
EnvUtil.environmentInit();
JobEntryLoader.init();
JobMeta jobMeta = new
JobMeta(LogWriter.getInstance(),filename,null);
Job job = new Job(LogWriter.getInstance(),StepLoader.getInstance()
,null,jobMeta);
job.getJobMeta().setInternalKettleVariables(job);
job.setVariable("XMLPATH", "D:\\etl\\gz_zb_zb");
job.setVariable("ZB_FJD",
"23d267b7aad54f5b961f66fac791b356");&&&&&&&
job.execute(); // You can pass arguments instead of null.
job.waitUntilFinished();
if ( job.getErrors() & 0 )
throw new RuntimeException( "There were errors during
transformation execution." );
catch ( KettleException e ) {
System.out.println(e);
job里,在需要调用的地方直接${变量名},调用就可以了
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。5074人阅读
原创(11)
Kettle版本:6.0.0.0.0.353
JDK:1.7_75
需要的Jar包(kettle-core-6.0.0.0-353.jar、kettle-engine-6.0.0.0-353.jar、metastore-6.0.0.0-353.jar)这三个是主要的
其他可能需要的包(apache-commons相关的、slf4j、javassist 等)。
把基本三个把加进去,启动之后根据具体提示补全剩下的包就好。所有的包,在Kettle的解压包里 \lib 都有
首先,第一步是要有一个转换文件。
如图,我的转换功能是,将一个Excel文件获取,做一些数据验证,然后返回给Java代码处理,中间会记录出错的总记录数。
该转换需要一个参数,输入Excel文件路径。
最后的空操作是为了在代码中用来监听该步骤来获取数据。
实现代码如下:
1、初始化Kettle。这个有个梗,对于Web项目,必须要更改一下用户目录,否则直接初始化第一次要加载很久才会有响应,更改完之后要改回来。
具体差异可以在命令行中输出一下&& user.dir& 来看看。更改之后生成的位置,WEB项目应该是在 WEB-INF目录下,会产生一个 .kettle 的文件夹,
里面包含一个kettle.properties 配置文件
(&Kettle Init...&);
// if (!KettleEnvironment.isInitialized()) {
// 获得执行类的当前路径
String user_dir = System.getProperty(&user.dir&);
// Kettle初始化需要修改相应的配置路径
System.setProperty(&KETTLE_HOME&, kettleHome);
System.setProperty(&user.dir&, kettleHome);
// 运行环境初始化(设置主目录、注册必须的插件等)
KettleEnvironment.init();
// Kettle初始化完毕,还原执行类的当前路径
System.setProperty(&user.dir&, user_dir);
// }2、创建转换对象,并指定转换文件位置。 setParameterValue 给转换的变量设值,将Excel文件的位置传过去。
String path = KettleUtils.class.getResource(&/&).toURI().getPath();
path += &ExcelTransform.ktr&;
TransMeta tm = new TransMeta(path);
Trans trans = new Trans(tm);
// trans.setLogLevel(LogLevel.ERROR);
trans.setParameterValue(&FILE_PATH&, excelPath);
trans.prepareExecution(null);
(&Kettle Recording...&);
3、记录每行的数据,并存在内存里 (数据量大的时候不建议直接这样做),然后启动。
这里的步骤是:getSteps 先获取转换里所有的步骤,如上图,通俗讲就是每一个图标节点。
然后steps.get 获取指定的步骤,上面说了我们监听最后一个步骤,那直接取 总步骤数的 size - 1 就好了。
然后给该步骤添加行监听器,在监听器的处理里获取数据并添加到List集合里,最后正式启动,并等待执行完成。
// 记录导入的每行数据
final List&RowMetaAndData& rows = new ArrayList&RowMetaAndData&();
RowListener rowListener = new RowAdapter() {
public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row) throws KettleStepException {
rows.add(new RowMetaAndData(rowMeta, row));
List&StepMetaDataCombi& steps = trans.getSteps();
String stepname = steps.get(steps.size() - 1).
StepInterface stepInterface = trans.findRunThread(stepname);
stepInterface.addRowListener(rowListener);
// 启动并等待执行完成
trans.startThreads();
trans.waitUntilFinished();
(&Kettle Processing...&);4、后续就是数据处理了,数据都已经到 List&RowMetaAndData& rows 里面了。通过字段名获取,第二个参数为值为空时的默认值。
for (int i = 0; i & rows.size(); i++) {
    RowMetaAndData rmad = rows.get(i);
    String rowNo = rmad.getString(&rowNo&, null);
    String errorCount = rmad.getString(&errorCount&, null);
    String errorTips = rmad.getString(&errorTips&, null);
KettleEnvironment.shutdown();
总体流程如上。提供给需要的一个参考。
这里有需要获取Kettle工具的日志输出也可以。提供另一篇文章记录的以供参考
http://blog.csdn.net/leave00608/article/details/
提供一个Kettle 4.4版本的API CHM文件下载。找不着更高版本的......不过一样能用,稍微有点变动
http://download.csdn.net/detail/leave6
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84434次
排名:千里之外
原创:12篇
转载:15篇
评论:18条
(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(2)(1)(2)(2)(2)(1)(2)(1)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'用户名:鱼塘鱼
文章数:67
访问量:74486
注册日期:
阅读量:1297
阅读量:3317
阅读量:459122
阅读量:1143638
[匿名]51cto游客:
51CTO推荐博文
1.新建Java测试类,导出Jar包,放在kettle目录中的libext文件中
package&&public&class&Test{&&&&&public&static&final&String&getMyName(String&name){&&&&&&&&&return&name+&12345&;&&&&&}&}
2.抽数据--经过java处理--输出文件到桌面
import&test.T&&public&boolean&processRow(StepMetaInterface&smi,&StepDataInterface&sdi)&throws&KettleException&{&&&&&Object[]&r&=&getRow();&&&&&if&(r&==&null)&{&&&&&&&&&setOutputDone();&&&&&&&&&return&&&&&&}&&&&&&if&(first)&&&&&{&&&&&&&&&first&=&false;&&&&&}&&&&&&//&It&is&always&safest&to&call&createOutputRow()&to&ensure&that&your&output&row's&Object[]&is&large&&&&&//&enough&to&handle&any&new&fields&you&are&creating&in&this&step.&&&&&//r&=&createOutputRow(r,&outputRowSize);&&&&&&&&&&/*&TODO:&Your&code&here.&(See&Sample)&&&&&&&&&&/&Get&the&value&from&an&input&field&&&&&String&foobar&=&get(Fields.In,&&a_fieldname&).getString(r);&&&&&&foobar&+=&&bar&;&&&&&&&&&&//&Set&a&value&in&a&new&output&field&&&&&get(Fields.Out,&&output_fieldname&).setValue(r,&foobar);&&&&&&*/&&&&&&//调用jar&&&&&String&foobar&=&get(Fields.In,&&ENAME&).getString(r);&//输入参数&&&&&foobar&+=&Test.getMyName(&我是谁的水&);&&&&&get(Fields.Out,&&ENAME&).setValue(r,&foobar);&&&&&&&&&&&//获取参数&&&&&&String&AGEField&=&getParameter(&AGE&);&&&&&&get(Fields.Out,&&AGE&).setValue(r,&AGEField);&//输出参数&&&&&&&&&&&//&Send&the&row&on&to&the&next&step.&&&&&putRow(data.outputRowMeta,&r);&&&&&&return&&}&
&本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
请输入验证码:匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。& & & 该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义功能的实现改为在eclipse等ide中开发。
& & & 设计本插件的原因是直接在kettle中写java代码是很不容易的事,开发体验与eclipse差得远,java语法还要受到限制,调试麻烦。实现点简单的逻辑还行,稍微复杂一点就比较麻烦,需要对java和kettle相关接口很熟悉。而简单的功能可以采用javascript脚本实现,复杂的功能一般人很难直接在自定义java类控件中编写java实现。
& & & 有人说可以每次直接开发新插件,虽然说java的插件机制还是很不错的,但开发一个插件还是没那么容易的,需要设计元数据,插件件功能实现,插件操作界面设计等,其中操作界面的调整是我最不愿意花时间的,慢慢调我也能调出常见控件的配置界面,但我觉得没必要,所以要实现一个完善的插件需要做的事情还是很多的。
& & & 而本插件综合了以上两种机制,既有自定义java类的简单性,直接编写核心业务代码,操作界面统一使用一个JSON对象作为参数设置途径,所以基于此开发功能,只需继承一个基类而编写一个功能实现类就可以了;又有直接开发插件的便捷性,只需将相关的jar包作为用户类库导入项目,创建一个类,继承基类,就可以在eclipse中尽情的编写你的业务代码了。
& & & 该插件已经作为我的另一个开源项目kettle管理平台(/majinju/p/5739820.html)的一个子项目开源,相关代码可以从github上那个项目中获取,下面介绍下基于该插件开发实现自己业务的插件。
在eclipse中创建用户类库ku,到kettle管理平台项目介绍的博文中下载0.1.0版部署包,然后将部署包的lib目录中的jar全部加入。
在eclipse中创建一个java项目,添加上一步创建的用户类库到构建路径,然后新建一个java类,以下是转换步骤实现代码样例。
* Project Name:KettleUtil
* Copyright (c) 2016, jingma All Rights Reserved.
package net.oschina.kettleutil.
import net.oschina.kettleutil.KettleUtilRunB
import net.oschina.mytuils.KettleU
import org.pentaho.di.core.row.RowMetaI
import org.pentaho.di.core.row.ValueM
import org.pentaho.di.core.variables.VariableS
import org.pentaho.di.trans.TransM
import org.pentaho.di.trans.step.StepM
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONA
import com.alibaba.fastjson.JSONO
* kettle util 运行示例&br/&
* date: 日 &br/&
* @author jingma
* @version
public class KurDemo extends KettleUtilRunBase{
* 具体处理每一行数据
* @see net.oschina.kettleutil.KettleUtilRunBase#disposeRow(java.lang.Object[])
protected void disposeRow(Object[] outputRow) {
//设置JOB名称
outputRow[getFieldIndex("JOB_NAME")] = KettleUtils.getRootJobName(ku);
* @see net.oschina.kettleutil.KettleUtilRunBase#init()
protected void init() {
ku.logBasic("初始化插件");
* @see net.oschina.kettleutil.KettleUtilRunBase#end()
protected void end() {
ku.logBasic("数据处理结束");
* @see net.oschina.kettleutil.KettleUtilRunBase#getDefaultConfigInfo(org.pentaho.di.trans.TransMeta, java.lang.String)
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);
//生成的参数样例
//返回格式化后的默认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
* Copyright (c) 2016, jingma All Rights Reserved.
package net.oschina.kettleutil.
import net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunB
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONA
import com.alibaba.fastjson.JSONO
* job entry kettle util 运行示例&br/&
* date: 日 &br/&
* @author jingma
* @version
public class JeurDemo extends JobEntryKettleUtilRunBase{
* @see net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunBase#run()
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)
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);
//生成的参数样例
//返回格式化后的默认JSON配置参数,供使用者方便快捷的修改配置
return JSON.toJSONString(params, true);
return "select *\n from dual";
& & &4. 开发完成后,打包放入kettle lib中,重启kettle。以下是该插件配置界面,可以修改步骤名称,在类名称处填写你的实现类的完整类路径,然后就可以点击【获取默认配置】按钮,获取你配置的实现类对应的配置信息,根据需要修改即可完成配置。以下分别是转换的插件实现示例和作业实体实现示例截图。
  以上就完成了基于该插件的开发使用工作,由上可以看出,执行编写一个类,就可以完成一个插件的开发工作。
阅读(...) 评论()}

我要回帖

更多关于 kettle 公式组件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信