Kettle循环

/ Kettle / 没有评论 / 48浏览

介绍Kettle循环遍历表

场景

例如,我们有个任务,需要执行多次,但每次执行的参数不一样。我们可以把这些参数存到一个表里面,然后读取,遍历执行。

写在前面

这样一个配置表,我命名为settings

idname
1xxx
2xxx
3xxx

当然表结构按照实际的来。

Kettle循环

原理

Kettle循环主要利用JavaScript脚本控制循环变量i++,并通过环境变量传递值。

流程图

主要流程如下:

流程图

其中,job中有两个转换,分别为: 获取数据循环输出

获取数据

获取数据转换如下:

获取数据

表输入节点

表输入

表输入节点主要是查询表,获取每一行的数据,供后面一行一行遍历。

复制记录到结果

复制记录到结果

这里主要是将记录复制,供下一个节点loop来获取结果。

loop节点

loop节点

loop节点主要通过上一个结果获取所有行rows、初始化sizei环境变量,以及将第一行记录的每一列(idname)放到环境变量中。

代码:

var rows = previous_result.getRows();
if (rows == null || rows.size() == 0) {
    false;
} else {
    parent_job.setVariable("rows", rows);
    parent_job.setVariable("size", rows.size());
    parent_job.setVariable("id", rows.get(0).getString("id", "id"));
    parent_job.setVariable("name", rows.get(0).getString("name", "name"));
    parent_job.setVariable("i", new Number(0));
    true;
}

for节点

for节点

这里主要校验循环是否遍历完了,我们需要判断变量i是否小于size

循环输出

循环输出转换如下:

循环输出

从结果获取记录

从结果获取记录

这里主要获取遍历每一行设置的环境变量,即字段(idname)信息。

写日志

这一步为核心业务,主要为对每一行的自定义处理,我这里只输出日志。

写日志

i++

i++

这一步主要是让循环遍历i自增,并设置当前行每一列字段(idname)到环境变量。

代码:

var rows = previous_result.getRows();
var size = new Number(parent_job.getVariable("size"));
var i = new Number(parent_job.getVariable("i")) + 1;

if(i < size){
    parent_job.setVariable("id", rows.get(i).getString("id", "id"));
    parent_job.setVariable("name", rows.get(i).getString("name", "name"));
}

parent_job.setVariable("i", i);
true;

运行

运行