详解kettle之User Defined Java Class步骤(二)



详解User Defined Java Class步骤(二)

 

     kettle中的“user defined java class”步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能;可以在其中写任意代码,却不影响效率。本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载.


 如果没有从第一部分开始,请访问第一部分


使用步骤参数(Step Parameter

     如果你写了一段代码,如果想让带更通用,步骤参数这时就能用到;在示例中,我们提供一个正则表达式和一个字段的名称,该步骤检查参数对应的字段是否匹配正则表达式,如果是返回结果为1,反之为0

代码如下:

import java.util.regex.Pattern;

 

private Pattern p = null;

private FieldHelper fieldToTest = null;

private FieldHelper outputField = null;

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

   Object[] r = getRow();

   if (r == null) {

       setOutputDone();

       return false;

   }

   // prepare regex and field helpers

   if (first){

       first = false;

       String regexString = getParameter("regex");

       p = Pattern.compile(regexString);

       fieldToTest = get(Fields.In, getParameter("test_field"));

       outputField = get(Fields.Out, "result");

   }

   r= createOutputRow(r, data.outputRowMeta.size());

   

   // Get the value from an input field

   String test_value = fieldToTest.getString(r);

   // test for match and write result

   if (p.matcher(test_value).matches()){

       outputField.setValue(r, Long.valueOf(1));

   }

   else{

       outputField.setValue(r, Long.valueOf(0));

   }

   // Send the row on to the next step.

   putRow(data.outputRowMeta, r);

   return true;

}

     getParameter()方法返回在ui界面中定义的参数对应值内容,当然参数的值也可能是kettle的变量。把变量作为参数是使用变量通常的做法。我们可以在步骤的xml代码中手工搜索到变量。

     示例的转换名称是:parameter.ktr.

 

消息步骤(Info Steps)使用

     有时需要合并多个输入步骤,可能赋予不同的角色,就如流查询步骤。消息步骤用来提供查询,其数据行不通过getRow()方法返回。在udjc步骤中非常容易使用。在udjc步骤的ui界面消息步骤选项卡中定义,通过getRowsFrom()方法返回对应的值。

     示例转换中使用消息步骤接收一组正则表达式,用其测试主流数据中的一个字段是否匹配,如果任何一个表达式匹配,结果字段设置为1.如果没有任何匹配,则结果为0,同时附加输出匹配的表达式。

     

代码如下:

import java.util.regex.Pattern;

import java.util.*;

 

private FieldHelper resultField = null;

private FieldHelper matchField = null;

private FieldHelper outputField = null;

private FieldHelper inputField = null;

private ArrayList patterns = newArrayList(20);

private ArrayList expressions = newArrayList(20);

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

   Object[] r = getRow();

 

   if (r == null) {

       setOutputDone();

       return false;

   }

   

   // prepare regex and field helpers

   if (first){

       first = false;

       // get the input and output fields

       resultField = get(Fields.Out, "result");

       matchField = get(Fields.Out, "matched_by");

       inputField = get(Fields.In, "value");

       

       // get all rows from the info stream andcompile the regex field to patterns

       FieldHelper regexField = get(Fields.Info, "regex");

       RowSet infoStream = findInfoRowSet("expressions");

       

       Object[] infoRow = null;

       while((infoRow = getRowFrom(infoStream)) != null){

           String regexString = regexField.getString(infoRow);

           expressions.add(regexString);

           patterns.add(Pattern.compile(regexString));

       }

 

   }

 

   // get the value of the field to check

   String value = inputField.getString(r);

 

   // check if any pattern matches

   int matchFound = 0;

   String matchExpression = null;

   for(int i=0;i<patterns.size();i++){

       if (((Pattern) patterns.get(i)).matcher(value).matches()){

           matchFound = 1;

           matchExpression = (String)expressions.get(i);

           break;

       }

   }

 

   // write result to stream

   r= createOutputRow(r, data.outputRowMeta.size());

   resultField.setValue(r, Long.valueOf(matchFound));

   matchField.setValue(r, matchExpression);

 

   // Send the row on to the next step.

   putRow(data.outputRowMeta, r);

 

   return true;

}

     调用findInfoRowSet()方法,返回在udjc步骤的消息步骤中定义的名称对应的输入步骤的整个行集内容。从行集内容中读取某行与从主数据流中去某行不同,通过调用getRowFrom(),并显示指明那个行集。

     示例转换的名称为info_steps.ktr.

 

使用目标步骤(Target Steps

     使用udjc步骤有时可能需要指定行集流转到不同的目标步骤。通过调用putRow()方法,并传递一个目标步骤作为参数。我们需要在udjc步骤的ui界面的目标步骤中定义所有可能的目标步骤,下面示例中随机分发行数据到不同弄的目标步骤。

     findTargetRowSet()方法返回在ui界面中定义的目标步骤行集,并作为putRowto()方法的参数.示例转换的名称为target_steps.ktr.

代码如下:

import java.util.regex.Pattern;

import java.util.*;

 

private RowSet lowProbStream = null;

private RowSet highProbStream = null;

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

   Object[]r = getRow();

 

   if(r == null) {

      setOutputDone();

      returnfalse;

   }

   

   //prepare regex and field helpers

   if (first){

       first = false;

      lowProbStream= findTargetRowSet("low_probability");

      highProbStream= findTargetRowSet("high_probability");

   }

 

   //Send the row on to the next step.

   if(Math.random() < 0.35){

      putRowTo(data.outputRowMeta, r,lowProbStream);

   }

   else{

      putRowTo(data.outputRowMeta, r,highProbStream);

   }

 

   returntrue;

}

 

更多内容请查看第三部分

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kettle 是一个开源的 ETL 工具,可以用于将数据从一个地方抽取到另一个地方,并进行转换和加载。Kettle 也提供了 Java API,可以在 Java 代码中使用 Kettle 来完成 ETL 任务。 下面是一个简单的示例,演示如何使用 KettleJava API 来执行一个简单的 ETL 任务。 首先,需要添加 Kettle 的依赖。可以在 Maven 中添加以下依赖: ```xml <dependency> <groupId>org.pentaho</groupId> <artifactId>kettle-core</artifactId> <version>8.3.0.0-371</version> </dependency> ``` 然后,在 Java 代码中,可以创建一个 Kettle 环境对象,并使用此对象来执行 ETL 任务。以下是一个使用 KettleJava 代码示例: ```java import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LogLevel; import org.pentaho.di.job.Job; import org.pentaho.di.job.JobMeta; public class KettleJavaExample { public static void main(String[] args) throws KettleException { // 初始化 Kettle 环境 KettleEnvironment.init(); // 创建 JobMeta 对象,指定 Job 的定义文件 JobMeta jobMeta = new JobMeta("path/to/job.kjb", null); // 创建 Job 对象 Job job = new Job(null, jobMeta); // 设置日志级别 job.setLogLevel(LogLevel.BASIC); // 执行 Job job.start(); // 等待 Job 执行结束 job.waitUntilFinished(); // 获取 Job 的执行结果 boolean success = job.getResult().getResult(); if (success) { System.out.println("Job executed successfully."); } else { System.out.println("Job execution failed."); } } } ``` 在上面的示例代码中,假设已经有一个定义好的 Job 文件,文件名为 `job.kjb`,并且该文件位于项目根目录下的 `path/to` 目录中。可以使用 `JobMeta` 对象来加载该文件,并创建 `Job` 对象来执行该 Job。在执行 Job 之前,可以设置日志级别,以便更好地跟踪执行过程。最后,等待 Job 执行结束,获取执行结果,并根据结果输出相应的消息。 注意,KettleJava API 可能不是很友好,需要仔细阅读相关文档和示例代码,并进行反复试验和调试,才能熟练掌握。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值