kettle转换步骤工作组件

这里有四个类构成了这个kettle 步骤/节点,每一个类都有其特定的目的及所扮演的角色。

TemplateStep:  步骤类实现了StepInteface接口,在转换运行时,它的实例将是数据实际处理的位置。每一个执行线程都表示一个此类的实例。

TemplateStepData:  数据类用来存储数据,当插件执行时,对于每个执行的线程都是唯一的。执行时里面存储的东西主要包括数据库连接、文件句柄、缓存等等其他东西。

TemplateStepMeta: 元数据类实现了StepMetaInterface接口。它的职责是保存和序列化特定步骤实例的配置,在我们这个例子中,它负责保存用户设置的步骤名称和输出字段的名称。

TemplateStepDialog:对话框类实现了该步骤与用户交互的界面,它显示一对话框,通过对话框用户可以自己的喜好设定步骤的操作。对话框类与元数据类关系非常紧密,元数据类可以追踪用户的设置。

除了上面的代码,还有一个plugin.xml,它设置好了插件的元数据,定义了步骤在kettle图形工作台中的显示效果。为了更好的让大家理解,我将利用这个步骤设计一个转换流程并执行它。对于插件的开发,我们将从plugin.xml配置文件开始讲起,然后讲讲元数据和对话框类,最后再讲讲步骤类和数据类。

书写你自己的plugin.xml:

下面plugin.xml是我们这个插件里面的内容,它的功能是告诉kettle插件的元数据类,插件的名称及描叙,还有需要加载的jar包。想要了解细节,可以查看文章:plug-in loading

<?xml version="1.0" encoding="UTF-8"?>

<plugin

id="TemplatePlugin"

iconfile="icon.png"

description="Template Plugin"

tooltip="Only there for demonstration purposes"

category="Demonstration"

classname="plugin.template.TemplateStepMeta">

<libraries>

<library name="templatestep.jar"/>

</libraries>

</plugin>

 

ID:在kettle插件中必须全局唯一,因为被kettle序列化了,所以不要随便改变

Iconfile: kettle中插件显示的图片,必须是png图片

Description:插件描叙,显示在树形菜单里面。

Tooltip:树形菜单中,鼠标滑过的时候显示的提示信息

Category:插件显示的父目录

Classname:元数据类

Library:指明了插件需要加载所依赖的jar包

插件主要包含类介绍

一、元数据类:

下面显示了元数据的几个关键的方法,注意元数据类里面用私有成员变量outputField 存储了下一个步骤的输出字段。

// keep track of the step settings
public String getOutputField()
public void setOutputField(…)
public void setDefault()

// serialize the step settings to and from xml
public String getXML()
public void loadXML(…)

// serialize the step settings to and from a kettle repository
public void readRep(…)
public void saveRep(…)

// provide information about how the step affects the field structure of processed rows
public void getFields(…)

// perform extended validation checks for the step
public void check(…)

// provide instances of the step, data and dialog classes to Kettle
public StepInterface getStep(…)
public StepDataInterface getStepData()
public StepDialogInterface getDialog(…)

TemplateStepMeta元数据类其实还有很多方面,不过大多被他的父类BaseStepMeta给默认实现了,这些默认的实现足以使我们的元数据类工作良好。想要了解更多,大家可以查查关于StepMetaInteface和BaseStepMeta的kettle官方文档。

二、对话框类:

TemeplateStepDialog为步骤实现了对话框的设置,kettle的用户界面部件是使用的eclipse的swt框架,如果要开发比较复杂的对话框,你还必须熟悉大部分swt代码。 Swt文档大家可以从eclipse上的帮助菜单点击在线获取。在开发过程中,一个对话框对象拥有一个元数据对象,它记录了应该从哪里读取配置?应该把设置好的配置保存在哪里?它仅仅设置了输出字段的名称在我们这个模板步骤里面。一个继承自BaseStepDialog特定的对话框类必须提供open(…)方法,这个方法必须返回这个步骤的名称(发生改变时)或NULL(对话框被取消时)

三、步骤类:

步骤类是实际的处理和转换工作的地方。因为大部分样本代码已经由父类BaseStep提供了,大多数插件仅仅关注下面几个特定的方法就行。

// initialization and teardown
public boolean init(…)
public void dispose(..)

// processing rows
public void run()
public boolean processRow(..)

Init()方法在转换执行前被kettle调用,转换必须在所有步骤初始化成功时才真正执行。我们这个模板步骤没有做任何事情,这里仅仅是拿出来让大家了解了解。

dispose()方法是在步骤执行完之后执行(非转换执行完哈),它完成资源的关闭,像文件句柄、缓存等等。

run()方法在实际处理记录集的时候调用。里面其实是个调用processRow()方法处理记录的小循环,当此步骤再没有数据处理或转换被停止时退出循环。

processRow()方法在处理单条记录的时候被调用。这个方法通常通过调用getRow()来获取需要处理的单条记录。 这个方法如果有需要将会被阻塞,例如当此步骤希望放慢脚步处理数据时。processRow()随后的流程将执行转换工作并调用putRow()方法将处理过的记录放到它的下游步骤。

注意:你的步骤可能会变记录的结构,为了安全起见,一定要多熟悉包org.pentaho.di.core.row,特别是类RowMetaInterface和RowDataUtil。

基类BaseStep对处理的记录提供了第一次访问的标识,在某些代码只执行一次的时候可能非常有用,例如某个费时的查找,其实这就是缓存。

四、数据类:

大多数步骤都需要临时的缓冲或者临时的数据。数据类就是这些数据合适的存放位置。每一个执行线程将得到其拥有的数据类实例,所以它能在独立的空间里面运行。TemplateStepData继承自BaseStepData,作为一个经验法则,不要将non-constant字段放置BaseStepData类里面,如果你必须,请将它最好放置TemplateStepData数据类里面.

我们的步骤仅仅使用了一个数据对象来存储记录集输出的结构,没有用到其他的存储介质,例如文件等等。

开发插件实例

1.       在kettle-steps.xml下添加如下节点

<step id="MyTest">

<description>MyTest</description>

<classname>mytest.MyTestMeta</classname>

<category>插件测试</category>

<tooltip>测试</tooltip>

<iconfile>ui/images/TIP.png</iconfile>

</step>

 

 

 

 

 

 

 

 

 

2.       创建插件类

MyTest类代码

package mytest;

import org.pentaho.di.trans.Trans;

import org.pentaho.di.trans.TransMeta;

import org.pentaho.di.trans.step.BaseStep;

import org.pentaho.di.trans.step.StepDataInterface;

import org.pentaho.di.trans.step.StepInterface;

import org.pentaho.di.trans.step.StepMeta;

publicclass MyTest extends BaseStep implements StepInterface {

public MyTest(StepMeta stepMeta, StepDataInterface stepDataInterface,

int copyNr, TransMeta transMeta, Trans trans) {

super(stepMeta, stepDataInterface, copyNr, transMeta, trans);

// TODO Auto-generated constructor stub

}

}

 

 

MyTestData类代码

package mytest;

import org.pentaho.di.trans.step.BaseStepData;

import org.pentaho.di.trans.step.StepDataInterface;

publicclass MyTestData extends BaseStepData implements StepDataInterface {

}

 

MyTestMeta类代码

package mytest;

import java.util.List;

import java.util.Map;

import org.pentaho.di.core.CheckResultInterface;

import org.pentaho.di.core.Counter;

import org.pentaho.di.core.database.DatabaseMeta;

import org.pentaho.di.core.exception.KettleException;

import org.pentaho.di.core.exception.KettleXMLException;

import org.pentaho.di.core.row.RowMetaInterface;

import org.pentaho.di.repository.ObjectId;

import org.pentaho.di.repository.Repository;

import org.pentaho.di.trans.Trans;

import org.pentaho.di.trans.TransMeta;

import org.pentaho.di.trans.step.BaseStepMeta;

import org.pentaho.di.trans.step.StepDataInterface;

import org.pentaho.di.trans.step.StepInterface;

import org.pentaho.di.trans.step.StepMeta;

import org.pentaho.di.trans.step.StepMetaInterface;

import org.w3c.dom.Node;

publicclass MyTestMeta extends BaseStepMeta implements StepMetaInterface {

public MyTestMeta()

{

super();

}

@Override

publicvoid setDefault() {

// TODO Auto-generated method stub

}

@Override

publicvoid loadXML(Node stepnode, List<DatabaseMeta> databases,

Map<String, Counter> counters) throws KettleXMLException {

// TODO Auto-generated method stub

}

@Override

publicvoid saveRep(Repository rep, ObjectId id_transformation,

ObjectId id_step) throws KettleException {

// TODO Auto-generated method stub

}

@Override

publicvoid readRep(Repository rep, ObjectId id_step,

List<DatabaseMeta> databases, Map<String, Counter> counters)

throws KettleException {

// TODO Auto-generated method stub

}

@Override

publicvoid check(List<CheckResultInterface> remarks, TransMeta transMeta,

StepMeta stepMeta, RowMetaInterface prev, String[] input,

String[] output, RowMetaInterface info) {

// TODO Auto-generated method stub

}

@Override

public StepInterface getStep(StepMeta stepMeta,

StepDataInterface stepDataInterface, int copyNr,

TransMeta transMeta, Trans trans) {

// TODO Auto-generated method stub

returnnull;

}

@Override

public StepDataInterface getStepData() {

// TODO Auto-generated method stub

returnnull;

}

}

MyTestDialog类代码

package mytest;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

import org.pentaho.di.trans.TransMeta;

import org.pentaho.di.trans.step.BaseStepMeta;

import org.pentaho.di.trans.step.StepDialogInterface;

import org.pentaho.di.ui.trans.step.BaseStepDialog;

publicclass MyTestDialog extends BaseStepDialog implements StepDialogInterface {

public MyTestDialog(Shell parent, Object in,

TransMeta transMeta, String stepname) {

super(parent, (BaseStepMeta)in, transMeta, stepname);

// TODO Auto-generated constructor stub

}

@Override

public String open() {

Shell parent = getParent();

Display display = parent.getDisplay();

shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);

props.setLook(shell);

shell.open();

shell.setSize(200, 200);

shell.setText("hello");

returnnull;

}

}

除TestDialog类外的3个类的代码都是在加入继承基类和接口后更加eclipse插件提示自动生成的,也是我们自己需要实现的方法,TestDialog类中的MyTestDialog方法参数是固定的,根据生成的需要修改下,open函数是要我们自己实现的,运行效果如下

双击MyTest后弹出一个空白的窗口

调用use define java class 插件

以kettle中自带的samples\transformations\User Defined Java Class - Calculate the date of Easter.ktr为例

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException

{

Object[] r=getRow();//从阻塞队列中获取一个数据对象(一行数据记录)

if (r==null)//如果没有可获取的数据,代表以处理完成

{

setOutputDone();//设置处理完成标志

return false;//退出循环

}

if (first) {//第一次进入循环

//初始化动作

first=false;//设置为非第一次循环

}

/*

*处理函数

*/

logBasic(r[0].toString());//打印

putRow(data.outputRowMeta, r);//输出到阻塞队列

return true;

}

use define java class 插件其实就是一个空插件,然后我们自己来实现processRow函数体,kettle通过while循环来调用processRow函数一行一行的处理数据,流程如下所示

kettle插入更新流程的更多相关文章

  1. kettle插入/更新

    1.数据库环境 --------------------实时表 ),Info )); ,'张启山','长沙'); ,'尹新月','长沙'); ,'二月红','长沙'); --------------- ...

  2. ETL Pentaho Data Integration (Kettle) 插入/更新 问题 etl

    Pentaho Data Integration (Kettle) 使用此工具 按 索引  做 插入更新操作时,也可能报 索引重复 的错误, 解决方法:  匹配的索引字段可能有null值,会导致此错误 ...

  3. kettle表更新/插入更新

    更新: 1.1更新表: 目标表: 插入更新: 2.1匹配表: 目标表: 插入/更新转换 目标表

  4. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...

  5. 【SQL模板】三.插入/更新 数据模板TSQL

    ---Name: 插入/更新 数据模板.sql ---Purpose: 用于更新 数据库中 历史数据 或 插入 新数据 的脚本模板 ---Author: xx ---Time: 2015-12-18 ...

  6. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  7. mysql 插入/更新数据

    mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...

  8. Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  9. Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新

    需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...

随机推荐

  1. Flutter学习五之网络请求和轮播图的实现

    上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...

  2. pytest封神之路第六步 断言技巧

    pytest的断言把Python语言简洁的优点发挥的淋漓尽致,因为它用的就是Python的标准断言assert. assert基础 assert用法 assert_stmt ::= "ass ...

  3. Kafka索引设计的亮点

    前言 其实这篇文章只是从Kafka索引入手,来讲述算法在工程上基于场景的灵活运用.单单是因为看源码的时候有感而写之. 索引的重要性 索引对于我们来说并不陌生,每一本书籍的目录就是索引在现实生活中的应用 ...

  4. GTA5整合版

    GTA5mod整合版游戏介绍 GTA5mod整合版游戏是一款完美破解的游戏,玩家能够在游戏中享受最爽快的角色动作扮演玩法,在这里你将是一名强大的黑帮分子,在这个都市中,你将体验最真实的黑帮社会玩法.G ...

  5. 机器学习可解释性系列 - 是什么&为什么&怎么做

    机器学习可解释性分析 可解释性通常是指使用人类可以理解的方式,基于当前的业务,针对模型的结果进行总结分析: 一般来说,计算机通常无法解释它自身的预测结果,此时就需要一定的人工参与来完成可解释性工作: ...

  6. Django新手图文入门教程

    版权所有,转载需注明来源! 本文是广受大家欢迎的<Django1.10新手图文入门教程>的2.1版本升级篇,原1.10版本传送门点击我 本文面向有一些的Python基础,但刚接触web框架 ...

  7. rustup命令速度慢

    通过以下命令更换镜像: $ENV:RUSTUP_DIST_SERVER='https://mirrors.ustc.edu.cn/rust-static' $ENV:RUSTUP_UPDATE_ROO ...

  8. NOIP提高组2016 D1T2 【天天爱跑步】

    码了一个下午加一个晚上吧...... 题目描述: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成 ...

  9. 重装Windows系统 入门详解 - 基础教程

    重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!️ 目录 重装Windows系统 入门详解 - 基础教程 一.说明 二.具体步骤 ( ...

  10. 3.字符设备led驱动

    1.硬件原理图 由图可知,led1,led2,led3,led4,分别对应GPB5,GPB6,GPB7,GPB8,由s3c2440芯片手册可得到如下图所示,分别配置GPBCON和GPBDAT即可 2. ...