1、kettle知识点系列之kettle的循环模式

kettle知识点系列之kettle的循环模式

在kettle的使用过程中难免会用到一些循环的操作,我这里总结了三种循环模式:简单模式、复杂模式、推荐模式。以下作业均围绕此场景描述展开。
场景描述:现有一个任务需求,要将n多个服务器下的m多个实例中的数据同步到同一个实例中,这些实例中数据库名称一致,密码可能不同,库中的表名都一致、但是库中的字段可能有差异,但是差异很小。

1、简单模式

这种循环方法网上很常见,但是不一定满足个人需求。这是我个人做的一个循环demo作业,对于简单模式的循环,一般执行的循环体为转换,如果为作业,作业中不能有复制记录到结果集组件,否则在循环的过程中获取的db配置会被覆盖掉。以下我对整个作业的基本组件内容贴出来。
(1)总任务
在这里插入图片描述
(2)转换
在这里插入图片描述
表输入内容:这里我是从数据库查询其他数据库的连接信息。

SELECT  
QXDMMC, 
QXDM ,
TARGET_HOST ,
TARGET_PORT,
TARGET_DB ,
SOURCE_HOST,
SOURCE_PORT,
SOURCE_DB,
SOURCE_PWD,
PASSWORD,
COM_HOST,
COM_PORT,
COM_DB,
SOURCE_PWD,
TARGET_PWD,
TARGET_USER,
SOURCE_USER,
COM_USER,
US_USER,
rownum as i
FROM  xxxx(表名)

(3)设置变量 :这是写的脚本设置变量

var prevRow=previous_result.getRows();//获取上一个传递的结果
if (prevRow == null &&(prevRow.size()=0))
{
    false;
}else{
	var myobj = prevRow.get(0);
	//设置db连接参数
   parent_job.setVariable("QXDM",myobj.getString("QXDM","QXDM"));
   parent_job.setVariable("QXDM",myobj.getString("QXDMMC","QXDMMC"));
   //这里其他参数都是这种写法,就不一一写了。
	
    parent_job.setVariable("DB_CONFIG", prevRow);//ArrayList存储
    parent_job.setVariable("size", prevRow.size());//存储执行表的总数量
    parent_job.setVariable("i", 0);//循环控制变量
	parent_job.setVariable("DB_CONFIG_ITEM",myobj);
    true;
}

(4)检测字段的值:这里主要控制循环的停止
在这里插入图片描述
(5)循环控制(js脚本)

var prevRow=previous_result.getRows();//获取上一个传递的结果
var i=new Number(parent_job.getVariable("i"));//获取循环变量
var size=new Number(parent_job.getVariable("size"));//循环总数
i++

if(i<size) {
	var myobj =  prevRow[i];
	parent_job.setVariable("DB_CONFIG_ITEM",myobj );
	//设置db连接新参数
	parent_job.setVariable("QXDM",myobj.getString("QXDM","QXDM"));
parent_job.setVariable("QXDM",myobj.getString("QXDMMC","QXDMMC"));
//这里其他参数都是这种写法,就不一一写了。
}
parent_job.setVariable("i", i);//变量加1
true;

(6)设置变量的使用。在转换中设置数据库的地方填写如下格式变量即可。
在这里插入图片描述

2、复杂模式

这种模式是在我解决问题的过程中自己写的,刚开始我使用简单模式处理场景需求,但是我的作业比较复杂,循环需要执行的地方是作业,作业中又有很多作业,作业中的转换又有复制记录到结果集组件,这样导致每次循环控制都是下标越界异常,最后发现是因为后续的复制记录到结果集覆盖掉了获取DB参数那里的结果集。因此有了如下解法。
(1)总任务
在这里插入图片描述

(2)获取DB配置
在这里插入图片描述
表输入:将记录拼接成JSON字符串

SELECT  ('{"QXDMMC":"'  || QXDMMC 
|| '","QXDM":"' 				|| QXDM 
|| '","TARGET_HOST":"'  || TARGET_HOST 
|| '","TARGET_PORT":"'  || TARGET_PORT
|| '","TARGET_DB":"'    || TARGET_DB 
|| '","SOURCE_HOST":"'  || SOURCE_HOST
|| '","SOURCE_PORT":"'  || SOURCE_PORT
|| '","SOURCE_DB":"'    || SOURCE_DB
|| '","SOURCE_PWD":"'   || SOURCE_PWD
|| '","PASSWORD":"'     || PASSWORD
|| '","COM_HOST":"'     || COM_HOST
|| '","COM_PORT":"'     || COM_PORT
|| '","COM_DB":"'       || COM_DB
|| '","SOURCE_PWD":"'   || SOURCE_PWD
|| '","TARGET_PWD":"'   || TARGET_PWD
|| '","TARGET_USER":"'  || TARGET_USER
|| '","SOURCE_USER":"'  || SOURCE_USER
|| '","COM_USER":"'     || COM_USER
|| '","US_USER":"'      || US_USER
|| '"}'
) AS QXDM
FROM  xxxx(表名)

(3)设置变量:注意这里js脚本用到了eval()函数,不懂得自行百度。

var prevRow=previous_result.getRows();//获取上一个传递的结果
if (prevRow == null &&(prevRow.size()=0))
{
    false;
}else{
	var myobj =  eval('(' + prevRow.get(0) + ')');
	//设置db连接参数
	parent_job.setVariable("QXDM",myobj[0].QXDM);
	parent_job.setVariable("QXDMMC",myobj[0].QXDMMC);
	parent_job.setVariable("TARGET_HOST",myobj[0].TARGET_HOST);
	parent_job.setVariable("TARGET_PORT",myobj[0].TARGET_PORT);
	parent_job.setVariable("TARGET_DB",myobj[0].TARGET_DB);
	parent_job.setVariable("SOURCE_HOST",myobj[0].SOURCE_HOST);
	parent_job.setVariable("SOURCE_PORT",myobj[0].SOURCE_PORT);
	parent_job.setVariable("SOURCE_DB",myobj[0].SOURCE_DB);
	parent_job.setVariable("COM_HOST",myobj[0].COM_HOST);
	parent_job.setVariable("COM_PORT",myobj[0].COM_PORT);
	parent_job.setVariable("COM_DB",myobj[0].COM_DB);
	parent_job.setVariable("PASSWORD",myobj[0].PASSWORD);
	parent_job.setVariable("SOURCE_PWD",myobj[0].SOURCE_PWD);
	parent_job.setVariable("TARGET_PWD",myobj[0].TARGET_PWD);
	parent_job.setVariable("TARGET_USER",myobj[0].TARGET_USER);
	parent_job.setVariable("SOURCE_USER",myobj[0].SOURCE_USER);
	parent_job.setVariable("COM_USER",myobj[0].COM_USER);
	parent_job.setVariable("US_USER",myobj[0].US_USER);
    parent_job.setVariable("DB_CONFIG", prevRow);//ArrayList存储
    parent_job.setVariable("size", prevRow.size());//存储执行表的总数量
    parent_job.setVariable("i", 0);//循环控制变量
	parent_job.setVariable("DB_CONFIG_ITEM",myobj);
    true;

}

(4)检测字段的值
在这里插入图片描述
(5)循环控制

var prevRow =  eval('(' + parent_job.getVariable("DB_CONFIG") + ')');
var i=new Number(parent_job.getVariable("i"));//获取循环变量
i++
var size=new Number(parent_job.getVariable("size"));//循环总数
if(i<size) {
	var myobj =  prevRow[i];
	parent_job.setVariable("DB_CONFIG_ITEM",myobj[0]);
	//设置db连接新参数
	parent_job.setVariable("QXDM",myobj[0].QXDM);
	parent_job.setVariable("QXDMMC",myobj[0].QXDMMC);
	parent_job.setVariable("TARGET_HOST",myobj[0].TARGET_HOST);
	parent_job.setVariable("TARGET_PORT",myobj[0].TARGET_PORT);
	parent_job.setVariable("TARGET_DB",myobj[0].TARGET_DB);
	parent_job.setVariable("SOURCE_HOST",myobj[0].SOURCE_HOST);
	parent_job.setVariable("SOURCE_PORT",myobj[0].SOURCE_PORT);
	parent_job.setVariable("SOURCE_DB",myobj[0].SOURCE_DB);
	parent_job.setVariable("COM_HOST",myobj[0].COM_HOST);
	parent_job.setVariable("COM_PORT",myobj[0].COM_PORT);
	parent_job.setVariable("COM_DB",myobj[0].COM_DB);
	parent_job.setVariable("PASSWORD",myobj[0].PASSWORD);
	parent_job.setVariable("SOURCE_PWD",myobj[0].SOURCE_PWD);
	parent_job.setVariable("TARGET_PWD",myobj[0].TARGET_PWD);
	parent_job.setVariable("TARGET_USER",myobj[0].TARGET_USER);
	parent_job.setVariable("SOURCE_USER",myobj[0].SOURCE_USER);
	parent_job.setVariable("COM_USER",myobj[0].COM_USER);
	parent_job.setVariable("US_USER",myobj[0].US_USER);
	
}
parent_job.setVariable("i", i);//变量加1
true;

(6)使用
在这里插入图片描述
3、推荐模式
这种模式是在我使用复杂模式后,我连接的资源库常常会因为这个循环导致速度慢、卡等问题,最后发现了这种模式。这种模式个人极力推荐,非常好用,比前两种好用。接下来对其进行详细介绍。
(1)总任务
在这里插入图片描述
(2)设置DB
在这里插入图片描述

表输入:

SELECT  QXDMMC, 
QXDM ,
TARGET_HOST ,
TARGET_PORT,
TARGET_DB ,
SOURCE_HOST,
SOURCE_PORT,
SOURCE_DB,
SOURCE_PWD,
PASSWORD,
COM_HOST,
COM_PORT,
COM_DB,
SOURCE_PWD,
TARGET_PWD,
TARGET_USER,
SOURCE_USER,
COM_USER,
US_USER,
rownum as i
FROM  xxx(表名)

(3)循环控制:切记必须勾选,否则无法循环
在这里插入图片描述
(4)作业:圈起来的转换必须要
在这里插入图片描述
(5)设置数据库连接变量:就是设置数据连接转换
在这里插入图片描述
从结果获取记录:
在这里插入图片描述
设置变量:
在这里插入图片描述
(6)用法:与其他模式一致。
在这里插入图片描述
以上就是我总结的有关kettle循环的例子,欢迎大家查看,如有问题请大家留言指出。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Kettle是一款强大的开源ETL(Extract, Transform, Load)工具,也被称为Pentaho Data Integration(PDI),它可以用于数据集成、数据转换和数据加载等任务。下面是一些Kettle的基本知识点: 1. 数据抽取(Extract):Kettle可以从各种数据源中抽取数据,包括关系型数据库、文件(如CSV、Excel)、Web服务、NoSQL数据库等。通过配置连接信息和查询语句,可以轻松地将数据导入到Kettle中进行后续处理。 2. 数据转换(Transform):Kettle提供了丰富的转换步骤和功能,可以对数据进行清洗、过滤、排序、聚合、计算等操作。可以使用可视化的方式来构建数据转换流程,通过连接各个步骤来实现复杂的数据处理逻辑。 3. 数据加载(Load):Kettle支持将转换后的数据加载到多种目标中,包括关系型数据库、文件、NoSQL数据库、Web服务等。可以通过简单的配置来指定目标数据源和表,将转换后的数据加载到目标位置。 4. 调度和监控:Kettle提供了调度和监控功能,可以按照预定的时间或事件触发数据集成和转换任务。可以设置定时任务,自动执行数据集成流程,并通过日志和警报来监控任务的运行情况。 5. 扩展和自定义:Kettle提供了丰富的插件和API,可以进行扩展和自定义。可以开发自定义的转换步骤、输入输出插件,满足特定的数据集成需求。还可以通过Kettle的API进行集成和扩展,与其他系统进行交互。 6. 可视化界面:Kettle提供了一个直观易用的可视化界面,可以通过拖拽和连接步骤来构建数据转换流程。界面友好,操作简单,使得用户可以快速上手并进行数据集成和转换的配置和管理。 Kettle作为一款强大的ETL工具,广泛应用于数据仓库、商业智能、数据集成等领域。它具有丰富的功能和灵活的扩展性,可以满足各种复杂的数据处理需求。学习Kettle可以使数据集成和转换任务变得更加高效和可靠。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值