kettle分页抽取数据

news/2024/11/23 23:10:04/

背景

kettle抽取数据大家还是比较熟悉的,kettle在抽取数据的时候会开启很多通道,同时抽取,但是我现在遇到一个场景:

从一个mysql数据库里获取“已办”状态的数据id,然后拿这些id去一个oracle数据库里查询,这些id在oracle数据中的状态是不是正确的,oracle数据库设置了in条件最多能in1000个值,并且oracle数据库是和核心生产库,我不能去创建表之类的进行关联,只有查询权限。

基于以上场景,通过java代码实现其实相当简单,做一个mysql分页,1000条匹配一次,但是用kettle还从来没做过分页,于是乎开始百度,但是大部分博主给的是错的,主要在变量部分,同一个转换中,“设置变量”后再通过${xx}获取变量值是获取不到的,必须跨转换才行,真的是比较奇怪。

下面就把完整的kettle过程贴出来:

总作业(workflow_oa_check.kjb)

  1. 给mysql数据库创建一个可以保存结果数据的表
  2.  获取分页页数,为了方便,其实输出的是页数*1000
  3. 循环页数匹配逻辑作业,注意,必须勾选“执行每一个输入行”,这样就会有循环的效果

 获取页数(workflow_oa_done_num.ktr)

  1. 已办总数,表输入, SELECT count(0) total from ( ${sql} ) temp   ,其中,具体sql是个变量,可以在job执行的时候自行复制,例如可以是select * from act_hi_taskins       
  2. 字段选择,将上一步的表输入字段选择
  3. java代码,根据总页数/每页的数量循环
    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {if (first) {first = false;}Object[] r = getRow();if (r == null) {setOutputDone();return false;}//此处创建 r,是为了获取输入参数TOTAL_SRC的值
    r = createOutputRow(r, data.outputRowMeta.size());double num = get(Fields.In, "total").getNumber(r);
    int pageNum = 1000;
    int pages = (int)num/pageNum +1;	//计算总页数
    System.out.println("=====================总页数"+pages);
    //生成页码,并输出
    for(int i=0;i<pages;i++){r = createOutputRow(r, data.outputRowMeta.size());get(Fields.Out, "PAGE").setValue(r, (i)*pageNum);		//将页码*pageNum 赋值给PAGE;putRow(data.outputRowMeta, r);
    } return true;
    }
  4. 复制记录到结果 

循环获取异常已办(workflow_oa_check_loop.kjb)

  1. 设置page,目的是从上一步的结果中获取页数*1000这个值,然后把这个值放到当前变量中

          

         

       2. 获取已办ids,通过获取变量EPAGE进行mysql库的分页操作,把获取的id集合放入变量中,select GROUP_CONCAT('''',ID_,'''') ids from  ( ${sql} LIMIT ${EPAGE},1000) temp

      

      

     3.输出oaids,根据上一步的ids,查询oracle库的异常数据,并将异常数据输出到最开始建的表中

     


http://www.ppmy.cn/news/1296440.html

相关文章

Doris 在工商信息商业查询平台的湖仓一体建设实践(02)

信息服务行业可以提供多样化、便捷、高效、安全的信息化服务,为个人及商业决策提供了重要支撑与参考。本文以某工商信息商业查询平台为例,介绍其从传统 Lambda 架构到基于 Doris Multi-Catalog 的湖仓一体架构演进历程。同时通过一系列实践,展示了如何保证数据的准确性和实时…

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩mask: true,

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩 官网测试示例&#xff1a; 1.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 测试代码&#xff1a; export function showDraw(isFlyTo) { removeLayer() const geoJsonLayer new mars3d.layer.GeoJsonLaye…

数据库系统原理总结之——数据库系统概述

数据库系统概述 第一章 数据库系统概述一、数据库基本概念二、数据库管理技术的发展三、数据库系统的三级模式结构四、数据库系统的运行与应用结构五、数据模型的分类 第一章 数据库系统概述 一、数据库基本概念 数据&#xff08;Data&#xff09; &#xff1a;描述事务的符号…

mysql使用load data导入数据

windows环境&#xff0c;使用bat脚本sql脚本 bat脚本 echo off ::调用数据入库sql脚本 set hour%time:~0,2% if "%time:~0,1%"" " set hour0%time:~1,1% set now%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2% echo %now% ::数据库地址…

Web前端篇——ElementUI之el-scrollbar + el-backtop + el-timeline实现时间轴触底刷新和一键返回页面顶部

ElementUI之el-scrollbar el-backtop el-timeline实现时间轴触底刷新和一键返回页面顶部。 背景&#xff1a;ElementUI的版本&#xff08;vue.global.js 3.2.36&#xff0c; index.css 2.4.4&#xff0c; index.full.js 2.4.4&#xff09; 废话不多说&#xff0c;先看动…

php实现支付宝商户转账

目录 一&#xff1a;背景介绍 一&#xff1a;准备工作 三&#xff1a;代码实现 一&#xff1a;背景介绍 最近工作中&#xff0c;要用到支付宝的商家转账功能&#xff0c;用php代码实现&#xff0c;网上找的内容&#xff0c;有些是老版本的实现&#xff0c;有些是调用sdk&am…

java值传递与引用传递

没有繁琐的各种内存指向图片&#xff0c;而是从概念中进行解释 值传递场景 值传递包含String类型以及基本数据类型&#xff0c;仅仅传递值&#xff0c; 基本上只会有一种场景 Testpublic void testModify(){String str1 "1";String str2 this.modifyStr(str1);Sy…

Qt中图片旋转缩放操作

在我们开发过程中&#xff0c;难免会遇到加载图片的问题&#xff0c;在上一个开发项目里我就遇到了图片缩放的问题&#xff0c;所以&#xff0c;我决定将这一部分好好研究&#xff0c;记录下来&#xff0c;希望对大家有帮助哟~ 在讲解之前&#xff0c;我们先看一看具体的展示效…