zoukankan      html  css  js  c++  java
  • 采用Kettle分页处理大数据量抽取任务

           

    作者:Grey

    原文地址: http://www.cnblogs.com/greyzeng/p/5524614.html

           

             

    需求:

    将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

           

    流程说明:
    transfer_table1_to_table2.kjb: 主流程

    build_query_page.ktr: 构造页数游标

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

           

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

           

    build_query_page.ktr: 构造页数游标

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

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

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

    SQL:

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

    具体实现如下图:

           

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

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

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

    loop_execute.kjb具体实现如下:

           

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

           

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

    其中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)

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

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

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

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

           

    最后,执行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).

    解决办法:

  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/greyzeng/p/5524614.html
Copyright © 2011-2022 走看看