Kettle 中转换(transformation)的执行过程,源码分析

本文深入分析Kettle转换执行流程,包括Trans类、StepInterface及其相关接口,如Trans的execute过程,Step的processRow方法,以tableinput和TextFileInput为例说明步骤执行。此外,探讨了插件init方法的使用和问题解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kettle 中转换的执行过程,源码分析

kettle中trans执行流程、以及具体step流程源码分析。

基础概念

每个转换步骤都是ETL数据流里面的一个任务。转换步骤包括输入、处理和输出。输入步骤从外部数据源获取数据,例如文件或者数据库;处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤。输出步骤将数据写会到存储系统里面,例如文件或者数据库。

转换相关类

Trans类
public class Trans implements VariableSpace, NamedParams, HasLogChannelInterface, LoggingObjectInterface,
  ExecutorInterface, ExtensionDataInterface {

此类表示与转换概念相关联的信息和操作。它装载,实例化、初始化、运行和监视指定的
Transinfo对象。

StepInterface继承体系

在这里插入图片描述实现StepInterface接口的类,在转换运行时,将是数据实际处理的位置。每个执行线程都表示一个实现StepInterface的实例。

  1. BaseStep实现了StepInterface是各step具体实现类的基类。完成了公用的处理函数,如putRow(),但是对于更具体的processRow()在StepBase的子类中。StepBase的主要成员有
    public ArrayList inputRowSets,outputRowSets;

    StepBase的子类每次从inputRowSets中取出一行数据,向outputRowSets中写入一行数据。

StepDataInterface继承体系
public class TableInputData extends BaseStepData implements StepDataInterface {

实现StepDataInterface接口的类为数据类,当插件执行时,对于每个执行执行的线程都是唯一的。保存于step相关的数据信息,比如行的元数据信息。

通常,StepDataInterface实现类将包含结果集、临时数据、缓存索引等。

BaseStepData

abstract class BaseStepData implements StepDataInterface
抽象基类BaseStepData 主要有一个step执行状态的内部枚举类。
enum StepExecutionStatus

TableInputData举例
public class TableInputData extends BaseStepData implements StepDataInterface {
  public Object[] nextrow;
  public Object[] thisrow;
  public Database db;
  public ResultSet rs;
  public String lookupStep;
  public RowMetaInterface rowMeta;
  public RowSet rowSet;
  public boolean isCanceled;
  public StreamInterface infoStream;

插件使用TableInputData data内部变量,一般主要有以下内容:

  1. 处理行元信息(字段信息)

一般在插件首次运行时,定义
Object[] parameters;
RowMetaInterface parametersMeta;
然后初始化
parameters = new Object[] {};
parametersMeta = new RowMeta();
然后查库,赋值这两个内部变量。

根据数据库查询的字段信息,赋值给 data.rowMeta

      // Keep the metadata
      data.rowMeta = data.db.getReturnRowMeta();

      // Set the origin on the row metadata...
      if ( data.rowMeta != null ) {
        for ( ValueMetaInterface valueMeta : data.rowMeta.getValueMetaList() ) {
          valueMeta.setOrigin( getStepname() );
        }
      }
  1. 处理具体记录信息
    每一行数据存储为一个Object[] 的对象数组。

tableInput 输入插件,在第一次进来时,先查库,一次性读到结果集中ResultSet rs,
然后赋值当前行 thisrow,和下一行 nextrow

      // Get the first row...
      data.thisrow = data.db.getRow( data.rs );
      if ( data.thisrow != null ) {
        incrementLinesInput();
        data.nextrow = data.db.getRow( data.rs );
        if ( data.nextrow != null ) {
          incrementLinesInput();
        }
      }
StepMetaInterface继承体系
public class TableI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值