Loading

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

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

作者:GreyZeng

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

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

你可以在这里自定义其他内容

posted @   Grey Zeng  阅读(38751)  评论(9编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu