• 采用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).

    解决办法:

  • 相关阅读:
    [bbk5177]第62集第6章 用scheduler自动化 10(章节标题内容调整)
    [bbk4956]第65集 第7章 数据库的维护 02
    [bbk4940]第61集第6章 用scheduler自动化 09
    [bbk5179]第66集 第7章 数据库的维护 03
    ORA01031: insufficient privileges(有待于二次解决)
    Google Analytics功能篇 如何跟踪邮件打开率与点击率
    小资之豆浆篇 (IS2120@BG57IV3)
    wix custom action 之 vbscript 简明步骤(IS2120@BG57IV3)
    c++ faq (15)
    linux 下面字符串处理函数实现 抄来看一下 抄自[http://blog.csdn.net/BeWithLei/article/details/1719242]
  • 原文地址:https://www.cnblogs.com/greyzeng/p/5524614.html
Copyright © 2020-2023  润新知