Kettle循环删除数据
1、问题描述:
某个系统原库的数据同步到备份库。但是由于原库的的数据会物理删除,此时需要删除备份库的数据。
2、不理想的解决1:
1)首先从备份库获取该表的所有ID;
2)循环备份库的ID,去原库检测下是否存在。不存在则表示原库已经物理删除,则删掉备份库对应的数据;原库存在则不处理备份库的数据。
3)图示:
说明点:
3-1、“获取备份库数据”步骤:
3-2、“获取遍历信息”步骤脚本:
1 2 3 4 5 6 7 8 9 10 11 12 | var prevRow=previous_result.getRows(); if (prevRow == null ||(prevRow.size()==0)){ false ; } else { parent_job.setVariable( "data" , prevRow); parent_job.setVariable( "size" , prevRow.size()); parent_job.setVariable( "i" ,0); true ; } |
3-3、“获取遍历信息”步骤:
3-4、“叠加器累计”步骤:
1 2 3 4 5 6 7 8 9 | var data=parent_job.getVariable( "data" ).replace( "[" , "" ).replace( "]" , "" ).split( "," ); //此处替换查询的数据特殊符号,并分割成数组。结果如:[[ID1],[ID2],[ID3],[ID4]...] var size = new Number(parent_job.getVariable( "size" )); var i = new Number(parent_job.getVariable( "i" )); if (i<size){ parent_job.setVariable( "id" , data[i].trim()); } parent_job.setVariable( "i" ,i+1); //计数器+1 true ; |
3-5、“删”步骤:
说明:此处做了假删,只是改变了数据状态。
Switch 判断del标志==0,时候才删除备份库。
select count(id) as del,'${id}' as id,'4' as c_data_status from table4 where EXISTS(select id from ${table} where id='${id}')
2、不理想的解决2:
1)采用查询两个数据的ID对比,做switch case 判断,再决定是否删除备份库的数据。
2)合并记录时候设置标志,然后根据标志判断
3、感受:
设计数据库的时候若有其他业务,还是不要设计成物理删除为好。
分类:
Kettle(ETL)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战