【备忘】使用Kettle(PDI)进行ETL

本文介绍如何使用 Kettle 5.0 进行两个数据库间的实时数据同步任务。主要内容包括利用转换(transformation)进行数据抽取和加载,以及通过作业(job)实现流程控制。文中还详细介绍了使用自增 ID 或偏移量来判断新增数据的方法。

Kettle是一款开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。

现有一个需求。将数据库1中一个表(原表)中的数据抽取出来放到数据库2中另外一个表(目标表)中。并实时更新。

工具为kettle 5.0

工具为工具为kettle 5.0 (spoon 5.0)

Kettle中有两种脚本文件,transformation(转换)和job(作业),transformation完成针对数据的基础转换,job则完成整个工作流的控制。

直接拖拽你想要的组件到面板 然后用鼠标中间滚轮或者按住shift鼠标左键拖拽就可以连接他们了。

下面谈谈主要的思路:

1.先count目标表 得到目标表的记录条数。

表输入2 3

2.查询原表中目标表没有的部分 (这里用了自增id 即 id比目标表条数大的部分就是目标表不存在的)

表输入3 2

或者用偏移量如下

表输入5

因为有要替换的变量(就是那个问号)所以记得勾选这三个:

唔

  1. 然后写原表与目标表相对应的字段:

字段选择2

4.最后传给目标表: 表输出2

来张 转换1 的全家福 其中标输入3 2 是用的自增id判断是否有新加入的行 表输入5是用的偏移量 这两个选一个(个人倾向偏移量)。 转换1

===========================以上的为转换1==================================

以下为 作业:

作业

其中转换2为: count下原表得到原表行数,然后与目标表比较一下 讲结果传入一个变量 转换2

变量是这么设置的 设置变量

在job里这么接收比较的:

接收变量

最后 脚本可以用Java代码调用kettle 5.0的和3.0的不一样 如下

<!-- lang: java -->
package test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

public class Test {
	public void runJob(String jobname){
		  try {
		   KettleEnvironment.init();
		   //jobname 是Job脚本的路径及名称
		   JobMeta jobMeta = new JobMeta(jobname, null);
		   Job job = new Job(null, jobMeta);
		   //向Job 脚本传递参数,脚本中获取参数值:${参数名}
		   //job.setVariable(paraname, paravalue);
		   job.start();
		   job.waitUntilFinished();
		   if (job.getErrors() > 0) {
		 
		    System.out.println("decompress fail!");
		   }
		  } catch (KettleException e) {
		   System.out.println(e);
		  }
		 }
		 
		   //调用Transformation示例:
		 
		public void runTrans(String filename) throws Exception {
		 
		    KettleEnvironment.init();
		    TransMeta transMeta = new TransMeta(filename);
		    Trans trans = new Trans(transMeta);
		    trans.prepareExecution(null);
		    trans.startThreads();
		    trans.waitUntilFinished();
		    
		    if (trans.getErrors()!=0) {
		      System.out.println("Error");
		    }
		  }


	public static void main(String[] args) {
		try {
			//new Test().runJob("script/j1.kjb");
			new Test().runTrans("script/t1.ktr");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

转载于:https://my.oschina.net/u/572987/blog/281222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值