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

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

Kettle进行数据迁移(ETL):  https://www.cnblogs.com/wlming/p/8080480.html

kettle详解(数据抽取、转换、装载): https://blog.csdn.net/u010735147/article/details/81905485

使用kettle进行增量抽取数据: https://blog.csdn.net/fangdengfu123/article/details/69229377

一种基于kettle的大数据平台数据抽取和统计方法与流程: http://www.xjishu.com/zhuanli/55/201610837148.html

kettle简单使用以及进行数据抽取同步: https://www.jianshu.com/p/d98d7d1179c7

ETL工具kettle怎么进行增量数据抽取:一、通过标志位: https://blog.51cto.com/13602563/2163559

大量数据快速导出的解决方案-Kettle:  https://www.cnblogs.com/itechpark/archive/2016/11/07/yinzei_kettle_excel.html

Kettle抽取数据-循环遍历数据: https://blog.csdn.net/daocaoren92wq/article/details/83655589

Kettle-7.0增量抽取订单数据: https://blog.csdn.net/zisheng_wang_data/article/details/71632011

kettle抽取——多平台汇总数据仓库:  https://blog.csdn.net/qq_35318838/article/details/66974575

采用Kettle分页处理大数据量抽取任务:  https://www.cnblogs.com/lcword/p/9570719.html

企业级增量抽取数据模型(Kettle版): https://www.javazhiyin.com/12405.html

Kettle使用时间戳抽取数据总结: http://www.manongjc.com/article/58382.html

 

Practitioner

需要不断努力,才能毫不费力

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

解决办法:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值