简介:在尝试使用了结果集的Demo循环后,进入到生产还是有一点问题的,以下是各个组件的分解解释、遇到的问题,以及解决问题的思路,最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔!
先来看张图~来自老大的压迫感!有压力才有动力!!!
🏆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核心:动态查询数据库中某张表某个字段的值,将这些值设置为变量,循环作业,实现数据加工的目的
JOB一览图(公开简化版)
灰色是不重要的步骤,根据自己的业务场景来,我这个简化版只是尽可能的复现生产环境的业务,仅此而已。红色加粗部分是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;
}
检验字段的值
获取变量自增处理
var prevRow=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("brand_code", prevRow.get(i).getString("brand_code", ""));
}
parent_job.setVariable("i",i);
true;
写日志
日志是调试的关键步骤
自己的逻辑代码
🏆2、JOB文件获取
V~老王玩编程 关键字:Kettle循环结果集
授之以鱼不如授之以渔,有兴趣的伙伴可以继续往下看,如果文章存在不合理需要补充的,欢迎指出修复,一起成长,一起进步!
🏆3、BUG记录及解决思路
技术永远是思路为先,你要先知道自己做什么,想要什么,就算不会,问别人问题,你也知道如何描述,如果思路不清楚,都不知道自己要干什么,是最可怕的。
⭐️3.1、第一个BUG
当时整理的下需求,自己处理的方式,以及想要提问的地方,想要什么结果。
需求
实现
问题
手动跑SQL脚本跑出来的数据 和JOB跑出来的数据不一致
这是手动跑出来的数据
有A 有B等级的数据
以下是JOB描述
job文件能获取到参数的值
这是SQL脚本中的设置
但是JOB跑出来的数据 全是供应商等级C 没有B
结论:感觉参数没有生效 但是不知道为什么
⭐️3.2、第一次解决
思路及解决方案:将Kettle日志调整为详细日志,看SQL脚本的执行语句。
发现问题:这是brand_code参数没有获取到值
好的,那么将品牌获取不到变量的问题修复掉(解决问题的ktr版本已经丢失,所以这里只记录解决过程),模糊记得当时是这么处理的,不重要,后面也是把这个方法替换掉了。
⭐️3.3、第二个BUG
将brand_code参数修复好以后,发现我又7个品牌的变量只给我设置一个100000207 品牌的 其他品牌变量丢掉了,也就是说到这里我的JOB获取到的品牌变量有且只有100000207 。201、202、203、204、205、206都没有
这里有一个大胆的猜想:就是从结果获取记录——设置变量 即使勾选了执行每一行输入行,默认只会输出最后一个值,而不是所有的值。
⭐️3.4、第二次解决
改变思路,既然转换里面的执行每一个输入行没有用了,虽然在Deme测试里面是没有问题的,但是这里一样的设置死活不生效的话,那就改变思路,使用JavaScript循环方式:
从这种JOB
升级为下图这种
⭐️3.5、第三个BUG
好,这是最后一个bug了,就是说现在是有一个品牌重复,能获取到6个品牌了,差一个品牌
⭐️3.6、第三次解决
思路及解决方案:品牌获取少了100000201,JavaScript的语法是用get获取数组的下标,如果少一个的话,就是下标0的品牌数据没有获取到,我将下标初始化从0改为-1,就可以了。
至此,思路及解决方案处理完毕!
🏆4、总结
- 遇到问题首先看日志,很多时候,答案往往在日志里面
- 遇到问题不要慌,大胆假设大胆猜想,然后细心的去推理是否符合逻辑
- 遇到自己一个小时搞不定的问题,首先要和老大沟通风险,评估风险,并给出最坏的解决方案
- 遇到自己一个小时搞不定的问题,可以尝试换个思路,或者是向别人寻求帮助,很多时候,你问问题之前,肯定要自己先顺一遍,才能给别人讲清除,那么就是自己给自己讲问题,顺思路的时候,往往就能发现问题