采用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 mds.mds_balances_hist) 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即可。

总结:

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

时间: 2024-10-28 11:38:03

采用Kettle分页处理大数据量抽取任务的相关文章

企业级控件库之大数据量分页控件(转)

在上篇:我介绍了原创企业级控件库之组合查询控件,这篇我将给大家介绍:企业级控件库之大数据量分页控件.  摘要  说到分页,大家采用的方法各有千秋,分页在一个中大型软件项目中对数据的快速呈现起到很关键的作用,试想一个数据量上几十万或者几百万的数据表,要是没有分页功能会是一个什么样的效果.总的说来,大家采用的分页方法大同小异,但到底那种方法才是最佳的呢,各有各的看法,让数据说话最有效.今天我给大家分享一个WinForm下大数据量分页控件(当然分页思想也可用于WebForm).虽然不能说是最佳的,但在

大数据量分页存储过程效率测试附代码

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话. 测试环境 硬件:CPU 酷睿双核T5750  内存:2G 软件:Windows server 2003    +   Sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 按 Ctrl+C 复制代码1create database data_Test --创建数据库data_Test 2GO 3use data

大数据量分页存储过程效率测试附代码(转http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html)

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话. 测试环境 硬件:CPU 酷睿双核T5750  内存:2G 软件:Windows server 2003    +   Sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 1create database data_Test  --创建数据库data_Test  2GO  3use data_Test  4GO

MySQL大数据量快速分页实现(转载)

在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢? 般刚开始学SQL语句的时候,会这样写 代码如下:  代码如下 复制代码 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 代码如下:  代码如下 复制代码 SELECT * FROM table ORDER BY id LIMIT 1000000, 10

MySQL大数据量分页查询方法及其优化

方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃. 方法2: 建立主键或唯一索引, 利用索引(假设每页10条) 语句样式: MySQL中,可用如下方法: SELECT * FRO

sql优化之大数据量分页查询(mysql)

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 谈优化前的准备工作 为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子. 表名:order_history. 描述:某个业务的订单历史表. 主要字段:unsigned int id,tinyint(4) int type. 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500

【转】大数据量分页写法

mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下: select * from product limit 10, 20   0.016秒select * from p

MySQL随机获取数据的方法,支持大数据量

最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到这里来,供大家学习. 在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的.下面我来介绍随机取数据一些优化方法. SELECT * FROM table_name ORDER BY ran

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须