精华内容
下载资源
问答
  • 分页抽取数据
    2021-02-26 10:32:00

    从数据库里取数

    image.png

    一、设置每次抽取条数

    image.png
    image.png

    1. 添加表输入步骤,通过count函数查出源数据表的数据量
      image.png
    2. 添加java代码步骤,将条数转换成页数
      image.png
      代码如下:
    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
      if (first) {
        first = false;
    
        /* TODO: Your code here. (Using info fields)
    
        FieldHelper infoField = get(Fields.Info, "info_field_name");
    
        RowSet infoStream = findInfoRowSet("info_stream_tag");
    
        Object[] infoRow = null;
    
        int infoRowCount = 0;
    
        // Read all rows from info step before calling getRow() method, which returns first row from any
        // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
        while((infoRow = getRowFrom(infoStream)) != null){
    
          // do something with info data
          infoRowCount++;
        }
        */
      }
    
      Object[] r = getRow();
    
      if (r == null) {
        setOutputDone();
        return false;
      }
    
      // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
      // enough to handle any new fields you are creating in this step.
      r = createOutputRow(r, data.outputRowMeta.size());
    
      double num = get(Fields.In, "totalCount").getNumber(r);
    int pageSize = 100;
    int pages = (int)num/pageSize +1;    //计算总页数
    //生成页码,并输出
    for(int i=0;i<pages;i++){
        //个人觉得r类似于输出器,如果想将每个页码都输出去,则必须独立进行声明,此步骤为本人测试所得
        r = createOutputRow(r, data.outputRowMeta.size());
        get(Fields.Out, "PAGE").setValue(r, i*pageSize);     //将页码赋值给PAGE
      putRow(data.outputRowMeta, r);
    } 
      return true;
    }
    
    1. 添加复制记录到结果步骤

    二、动态抽取

    image.png

    1、获取页数变量

    image.png
    image.png
    image.png
    image.png

    2、抽取数据

    image.png
    ①. 通过页数在数据源中抽数(我使用的是mysql数据库,不同数据库的分页方式不同)
    image.png
    ②. 将从数据源取出的数据保存下来(可以入库、输出文本、输出表格等,这里是保存到另一个数据库)
    image.png完整的文件在这,提取码:7f4k
    参考文章
    https://zhuanlan.zhihu.com/p/141173089

    更多相关内容
  • kettle处理大数据量表-分页抽取数据

    千次阅读 2020-12-01 14:20:12
    概述: 总job,分三步,第一:先清空目标表;...第三,根据第二步 生成的1、2、3...n的数据列,为每行都执行一次表插入,即实现分n次抽取数据插入。 在每次的执行中都根据变量,select 出对应的数据,进行表...

    概述:

    总job,分三步,第一:先清空目标表;

    第二,根据源表总的数据行,结合服务器配置 kettle每次能抽取插入多少行,算出需要分n次抽取,并生成1到n的序列值列表。
              ps:生成1、2、3...n 的数据列,然后把每个值赋值给变量var_page,   根据var_page的值分页查询。

    第三,根据第二步 生成的1、2、3...n的数据列,为每行都执行一次表插入,即实现分n次抽取数据插入。 

                在每次的执行中都根据变量,select 出对应的数据,进行表插入
                   eg: select  *

                         from  table

                         where rownum > (${var_page}-1) * 2000

                         and  rownum <  ${var_page} * 2000

     

     

     

     

    详细步骤:

    1.清空表

    省略

    2.根据源表总的数据行,结合服务器配置 kettle每次能抽取插入多少行,算出需要分n次抽取,并生成1到n的序列值列表

    eg:总行数 2W

       服务器kettle每次只能抽取 2k行

       需要抽取10次

       序列值列表 1 2 3 4 5 6...10

    2.0总览:

    2.1计算出要执行多少次

     

    SELECT ceiling(count(1)/2000) as p_max_page
    FROM src 

    PS:四舍五入 向上取值

    2.2选中字段,选中该执行频次字段

     

    2.3生成序列

    随便找个表,利用rownum 生成序列

     

    SELECT rownum as p_page
    from dwd_chaye_dakehuqudao
    where rownum <= ?

     

    PS:勾选替换变量,选择“从步骤插入数据” :

    2.4 选中序列字段

    PS: 这里 “”格式“” 这列要设置为   # , 不然会出现如下报错: 变量会增加小数位

    PS:要改成integer  类型的,不然会变成 1.0   2.0  3.0 .....

    2.5 复制记录到结果

    为了给以后步骤可用

     

    3.loop  循环执行 插入数据

    PS;勾选执行每行输入行

    3.1loop组件总览

     

    3.2 set var 设置变量 

    从第二步中获取序列值,复制给变量

     

    3.2.1 从结果获取记录

    3.2.2 赋值变量

     

    PS: 变量活动类型:  在父job中存活

     

    3.3 table input

    根据变量查询出  分页数据,插到目标表中

    3.3.1总览:

     

    3.3.2 表输入

     

    SELECT * 
    FROM src 
    UNPIVOT(
        data FOR index1 IN (签约金额,签约套数,签约面积)
    ) s
    where 1=1
    and rn > (${var_page}-1) *2000
    and rn <= ${var_page} *2000

     

     

    PS: 勾选 替换SQL中变量

     

    3.3.3 获取当前时间 (为目标表中 更新日期字段准备,不需要可省略)

     

    3.3.4 表输入

    正常选择对应表字段 对应即可

     

    以上完结。

    展开全文
  • 将MySQL中的数据进行分页抽取; 将分页抽取数据插入到另一个MySQL表中。 整体架构 第一步,build_query_page 查询所有的页码,将页码保存到结果; 第二步,set_values 从结果中获取页码,将页码设置为环境变量...

    需求:

    • 将MySQL中的数据进行分页抽取
    • 将分页抽取的数据插入到另一个MySQL表中。

    整体架构

    在这里插入图片描述

    • 第一步,build_query_page 查询所有的页码,将页码保存到结果;
    • 第二步,set_values 从结果中获取页码,将页码设置为环境变量;
    • 第三步,execute_by_page 从环境变量中获取页码,根据页码,循环获取每页数据并输出到表中。

    1.主流程

    transfer_table1_to_table2.kjb


    2.页数查询

    build_query_page.ktr

    2.1 input_page

    -- 每页30000条数据,查询页码
    SELECT
    	t.P_PAGE
    FROM (SELECT (@rowNum:=@rowNum+1) P_PAGE FROM t_kettle_test t, (select (@rownum :=0) ) b) t
    WHERE t.P_PAGE <= (SELECT CEIL(COUNT(*) / 30000) FROM t_kettle_test t)
    

    2.2 字段选择

    2.3 复制记录到结果字符串


    3.循环分页查询、插入

    loop_execute.kjb

    3.1 set_values.ktr

    3.1.1 get_page

    (从结果获取页码)

    3.1.2 set_param

    (将页码设置为环境变量)

    3.2 execute_by_page.ktr

    3.2.1 获取变量

    (获取之前设为环境变量的页码)

    3.2.2 query_by_page

    (根据页码分页查询数据)

    -- 每页30000条数据,查询数据
    SELECT t.* FROM (SELECT
    	(@rowNum:=@rowNum+1) rowNum, page.pageNum, t.*
    FROM t_kettle_test t, (select (@rownum :=0) ) row, (select ? pageNum) page) t
    WHERE t.rowNum > (t.pageNum - 1) * 30000 AND t.rowNum <= t.pageNum * 30000
    

    3.2.3 select_fields

    (筛选想要更新的字段)

    3.2.4 output_target

    (将查询到的数据输出到目标表里面)


    4.执行

    执行成功,结果如下所示:

    代码下载地址:
    https://download.csdn.net/download/qq_33204709/18714766





    参考地址:(文章略有改动)

    https://www.cnblogs.com/greyzeng/p/5524614.html

    展开全文
  • kettle分页抽取、插入实现.zip
  • 作者:Grey原文地址: 采用 Kettle 分页处理大数据抽取任务将数据库中某张表历史数据导入的一张表里面。源表(Oracle):table1目标表(MySQL):table2数据量:20,000,000由于服务器内存资源有限,所以,无法使用...

    采用 Kettle 分页处理大数据量抽取任务

    作者:Grey

    原文地址:

    博客园:采用 Kettle 分页处理大数据量抽取任务

    CSDN:采用 Kettle 分页处理大数据量抽取任务

    需求

    Oracle数据库中某张表历史数据导入MySQL的一张表里面。

    源表(Oracle):table1

    目标表(MySQL):table2

    数据量:20,000,000

    思路

    由于服务器内存资源有限,所以,无法使用Kettle一次性从源表导入目标表千万级别的数据,考虑采用分页导入的方式来进行数据传输,即:

    根据实际情况设置一个每次处理的数据量,比如:5,000条,然后根据总的数据条数和每次处理的数据量计算出一共分几页,

    假设总数据量有:20,000,000,所以页数为:20,000,000/5,000=4,000

    注: 若存在小数,小数部分算一页,比如:20.3算21页

    步骤

    根据需求的条件,首先对数据进行分页:

    数据量:20,000,000

    每页数据量:5,000

    页数:4,000

    源表(Oracle):table1

    目标表(MySQL):table2

    主流程:transfer_table1_to_table2.kjb

    image

    流程说明:

    transfer_table1_to_table2.kjb: 主流程

    build_query_page.ktr: 构造页数游标

    loop_execute.kjb: 根据页数来执行数据导入操作

    我们分别来看各个部分的构成:

    build_query_page.ktr: 构造页数游标

    这一步中,我们需要构造一个类似这样的数据结构:

    image

    其中P_PAGE是表头,其余为页码数,

    注: 在这里取页码数我通过这个表的rownum来构造

    select    rownum    as P_PAGE from mds.mds_balances_hist where    rownum<=4000
    

    具体实现如下图:

    image

    image

    image

    image

    image

    loop_execute.kjb: 根据页数来执行数据导入操作

    在上一步中,我们构造了页数,在这步中,我们遍历上一步中的页码数,通过页码数找出相应的数据集进行操作,

    其中包括set_values.ktr和execute_by_page.ktr两个转换

    loop_execute.kjb具体实现如下:

    image

    set_values.ktr:表示获取从上一步中获得的页数

    image

    execute_by_page.ktr:表示根据页数进行数据导入操作

    image

    其中query_by_page采用Oracle经典三层嵌套分页算法:

    SELECT b.rn,b.* FROM
    (
    SELECT A.*, ROWNUM RN 
    FROM (SELECT * FROM table1) A 
    WHERE ROWNUM <= (${VAR_P_PAGE}*5000) 
    ) b 
    WHERE RN >= ((${VAR_P_PAGE}-1)*5000+1)
    

    image

    注: ${VAR_P_PAGE}为每次获取的页码数。

    select_field为设置需要导入的列名:

    image

    image

    output_target目的是输出到目标表table2:

    image

    因为要遍历上一次执行的结果,那么需要在transfer_table1_to_table2.kjb的loop_execute.kjb中做如下设置:

    image

    最后,执行transfer_table1_to_table2.kjb即可。

    总结

    通过上述方法,我们可以很好的解决内存不足的情况下,大数据量在不同的数据库之间的导入工作。

    FAQ

    • 在Kettle导入大量数据的过程中,可能会出现连接断开的现象:

    http://forums.pentaho.com/showthread.php?74102-MySQL-connection-settings-at-java-level

    (Idle connection timeout if we keep kettle idle for 8hours).

    解决办法:

    image

    展开全文
  • ##背景: 使用kettle调用接口1获取token, 再调用接口2获取数据 ##问题: 对获取的数据如何进行分页抽取 ##我想要达到的结果: 数据保存到数据库
  • 1. 最好还是利用分析函数 row_number() over ( ... ------------------------------------------------------------------------ 经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的.
  • kettle分页迁移数据

    千次阅读 2020-01-19 21:24:21
    kettle分页迁移数据介绍个人开发环境软件架构安装教程使用说明 介绍 基于kettle开发的ETL数据迁移功能,具有分页功能,理论可稳定迁移大表。 kettle做数据库数据迁移的时候,如果数据库中的表过大(几十G,甚至更大...
  • kettle写的循环分页迁移数据的例子,迁移了36w数据,速度飞快,平均cpu使用只有19%。数据库表是运营商号段数据,网上有,比较大就不放上来了。
  • 由于服务器内存资源有限,所以,无法使用Kettle一次性从源表导入目标表千万级别的数据,考虑采用分页导入的方式来进行数据传输,即: 根据实际情况设置一个每次处理的数据量,比如:5,000条,然后根据总的数据条数和...
  • Spark抽取mysql中的数据到Hive中

    千次阅读 2021-10-20 09:53:32
    提示:文章写完后,目录可以...spark抽取mysql中的数据到hive中,可通过以下2步完成: 1.先将mysql中的数据抽取到存放再hdfs上的一个文件(.csv,.txt) 2.再讲文件通过load命令加载到hive中 下面用具体案例演示 一.
  • kettle数据抽取

    2017-07-18 10:28:17
    适合初学者学习使用kettle
  • 一、设置每次抽取条数 1.获取ES索引数据量 获取数据的方法与我之间写过的kettle从ES中抽数的文章中是一样的,只是本次抽数是为了获取索引的总条数,即total字段 1. 设置请求头参数 2. 获取数据(因为是之间对ES...
  • 在开发过程中我们经常会使用分页,核心技术是使用limit进行数据的读取,在使用limit进行分页的测试过程中,得到以下数据:select * from news order by id desc limit 0,10耗时0.003秒select * from news order by ...
  • PQSQL_数据分页抽取

    2021-09-16 15:38:23
    分页抽取(启用并行,少日志) FOR I IN 1..page LOOP SQL_T := ' insert into /*+ append */ '||TABLE_TARGET||' nologging ( '||FIELD_NAME||') SELECT /*+paralle(16)*/ '||FIELD_NAME||' FROM (SELECT /*+paralle...
  • 分页获取数据的方法

    2014-08-26 15:45:00
    一般情况下,我们用这种方式封装公用分页方法。   大数据时,下面方法效率高些: select hhh.n , hh.* from history hh , ( select top 50010 row_number() over ( order by time desc ) n,id ...
  •         作者:Grey 原文地址: ...将Oracle数据库中某张表历史数据导入MySQL的一张表里面。 源表(Oracle):table1 目标表(MySQL):table2 数据量:20,000,000 &...
  • 相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式:一、使用第三方工具,其中最著名的是火车头采集器,在此不做介绍。二、自己写程序抓取,这种方式要求站长自己写程序,...
  • 通过基础的数据库操作,在后期学习中多次使用从而方法不满足,抽取成工具 先是进行了条件查询,从而引出QueryHelper的工具类 QueryHelper:(为防止操作失误,选择传入类对象并赋予别名) 1.对问题进行分析即两个...
  • 微信小程序云开发随机分页获取数据,每次获取20条数据数据全部打乱获取 实现代码: db.collection('phoneList2') .aggregate() .sample({ size: 20 }) .end() .then(res => { console.log('搜索...
  • kettle抽取http请求,发送json参数示例
  • (1)Kettle数据抽取---全量抽取
  • 添加了几个自定义的 从mysql result 集合中 抽取指定片段的方法 , 没有调用释放的原因 这个涉及到 程序的 原来校验 也多亏网上大神的帮助啊 。。。。 老系统害死人啊, 后台都不能动 复制代码 代码如下: <?php /...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,579
精华内容 5,831
关键字:

分页抽取数据