Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介:在尝试使用了结果集的Demo循环后,进入到生产还是有一点问题的,以下是各个组件的分解解释、遇到的问题,以及解决问题的思路,最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔!

先来看张图~来自老大的压迫感!有压力才有动力!!!

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第1张图片

1、JOB拆解

1、首先,这个是本次JOB的一个主要实现的功能,伙伴们无需过多关注step3、step4是什么东西,只需要简单理解为,这个JOB是ads层供应商等级数据的一个加工,step1,删除本月数据,step2初始化供应商为C等级,step3 修改符合条件的供应商等级为B,step4,修改符合条件的供应商等级为A。其中本次作业的三个参数分别是tenant_id(租户),brand_id(品牌),date(时间)。

2、适合人群:

  • 有Kettle基础(硬性要求),
  • 有且用过变量知识最佳(没用过变量也没关系,这个JOB可自行下载下来,学习)

3、JOB核心:动态查询数据库中某张表某个字段的值,将这些值设置为变量,循环作业,实现数据加工的目的

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第2张图片

JOB一览图(公开简化版)

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第3张图片

灰色是不重要的步骤,根据自己的业务场景来,我这个简化版只是尽可能的复现生产环境的业务,仅此而已。红色加粗部分是JavaScript的核心代码

001_now_month

delete-nowMonth(自己的逻辑代码)

初始化数据(自己的逻辑代码)

002_select_Brand

获取上一个传递的结果

var prevRow=previous_result.getRows();//获取上一个传递的结果
if (prevRow == null &&(prevRow.size()=0))
{
    false;

}else{
    parent_job.setVariable("tables", prevRow);//ArrayList存储表名变量,以数组形式保存入table1,table2
    parent_job.setVariable("size", prevRow.size());//存储执行表的总数量
    parent_job.setVariable("i", -1);//循环控制变量  此处之所以是-1 不是0 是为了获取下标为0的品牌数据
    parent_job.setVariable("brand_code", prevRow.get(0).getString("brand_code", ""));
    true;

}

检验字段的值

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第4张图片

获取变量自增处理

var prevRow=previous_result.getRows();
var size = new Number(parent_job.getVariable("size"));
var i = new Number(parent_job.getVariable("i"))+1;
if(i     parent_job.setVariable("brand_code", prevRow.get(i).getString("brand_code", ""));
}
parent_job.setVariable("i",i);
true;

写日志

日志是调试的关键步骤

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第5张图片

自己的逻辑代码

2、JOB文件获取

V~老王玩编程 关键字:Kettle循环结果集

授之以鱼不如授之以渔,有兴趣的伙伴可以继续往下看,如果文章存在不合理需要补充的,欢迎指出修复,一起成长,一起进步!

3、BUG记录及解决思路

技术永远是思路为先,你要先知道自己做什么,想要什么,就算不会,问别人问题,你也知道如何描述,如果思路不清楚,都不知道自己要干什么,是最可怕的。

⭐️3.1、第一个BUG

当时整理的下需求,自己处理的方式,以及想要提问的地方,想要什么结果。

需求

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第6张图片

实现

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第7张图片

问题

手动跑SQL脚本跑出来的数据 和JOB跑出来的数据不一致

这是手动跑出来的数据

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第8张图片有A 有B等级的数据

以下是JOB描述

job文件能获取到参数的值

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第9张图片

这是SQL脚本中的设置

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第10张图片

但是JOB跑出来的数据 全是供应商等级C 没有B

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第11张图片

结论:感觉参数没有生效 但是不知道为什么

⭐️3.2、第一次解决

思路及解决方案:将Kettle日志调整为详细日志,看SQL脚本的执行语句。

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第12张图片

发现问题:这是brand_code参数没有获取到值

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第13张图片

好的,那么将品牌获取不到变量的问题修复掉(解决问题的ktr版本已经丢失,所以这里只记录解决过程),模糊记得当时是这么处理的,不重要,后面也是把这个方法替换掉了。

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第14张图片

⭐️3.3、第二个BUG

将brand_code参数修复好以后,发现我又7个品牌的变量只给我设置一个100000207 品牌的 其他品牌变量丢掉了,也就是说到这里我的JOB获取到的品牌变量有且只有100000207 。201、202、203、204、205、206都没有

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第15张图片

这里有一个大胆的猜想:就是从结果获取记录——设置变量 即使勾选了执行每一行输入行,默认只会输出最后一个值,而不是所有的值。

⭐️3.4、第二次解决

改变思路,既然转换里面的执行每一个输入行没有用了,虽然在Deme测试里面是没有问题的,但是这里一样的设置死活不生效的话,那就改变思路,使用JavaScript循环方式:

从这种JOB

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第16张图片

升级为下图这种

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第17张图片

⭐️3.5、第三个BUG

好,这是最后一个bug了,就是说现在是有一个品牌重复,能获取到6个品牌了,差一个品牌

⭐️3.6、第三次解决

思路及解决方案:品牌获取少了100000201,JavaScript的语法是用get获取数组的下标,如果少一个的话,就是下标0的品牌数据没有获取到,我将下标初始化从0改为-1,就可以了。

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第18张图片

Kettle循环结果集中的数据并传入SQL组件【或转换】里面_第19张图片

至此,思路及解决方案处理完毕!

4、总结

  1. 遇到问题首先看日志,很多时候,答案往往在日志里面
  2. 遇到问题不要慌,大胆假设大胆猜想,然后细心的去推理是否符合逻辑
  3. 遇到自己一个小时搞不定的问题,首先要和老大沟通风险,评估风险,并给出最坏的解决方案
  4. 遇到自己一个小时搞不定的问题,可以尝试换个思路,或者是向别人寻求帮助,很多时候,你问问题之前,肯定要自己先顺一遍,才能给别人讲清除,那么就是自己给自己讲问题,顺思路的时候,往往就能发现问题

你可能感兴趣的:(1024程序员节)