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

时间:2021-08-13 05:18:11

作者:Grey

原文地址: http://greyzeng.com/2016/10/31/big-data-etl/

需求:

将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

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

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

build_query_page.ktr: 构造页数游标

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

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

build_query_page.ktr: 构造页数游标

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

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

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

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

SQL:

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

具体实现如下图:

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

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

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

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

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

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

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

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

loop_execute.kjb具体实现如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

解决办法:

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

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

  1. MySQL分页查询大数据量优化方法

    方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...

  2. 参考 ZTree 加载大数据量。加载慢问题解析

    参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...

  3. 大数据量报表APPLET打印分页传输方案

     1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...

  4. 大数据量下,分页的解决办法,bubuko&period;com分享,快乐人生

    大数据量,比如10万以上的数据,数据库在5G以上,单表5G以上等.大数据分页时需要考虑的问题更多. 比如信息表,单表数据100W以上. 分页如果在1秒以上,在页面上的体验将是很糟糕的. 优化思路: 1 ...

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

    在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢?     般刚开始学SQL语句的时候,会这 ...

  6. MySQL大数据量分页查询

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  7. 【1】MySQL大数据量分页查询方法及其优化

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  8. mysql大数据量下的分页

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

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

    MySQL大数据量分页查询方法及其优化   ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...

随机推荐

  1. &period;NET 基础 一步步 一幕幕 &lbrack;注释、命名规则、访问修饰符、数据类型、常量、变量&rsqb;

    注释.命名规则.访问修饰符.数据类型.常量.变量 话说一个不会写注释的程序猿的不是一个好吃货,我们本篇就从注释开始说起好了. 在C#中有三种注释: 第一种:单行注释  以//开头,后面的就是注释内容 ...

  2. C语言初级进阶2

    运算符 逻辑运算符: && || ! 位运算符:& | ~ ^ 三目运算符: ? : 结构体元素访问: . -> 命令行参数argc与argv C语言中判断式 各种数据类 ...

  3. duilib各种布局的作用,相对布局与绝对布局的的意义与用法

    大多数刚使用duilib的朋友时候非常依赖duilib自带的设计器,用他可以拖拉控件,可视化的做出自己想要的界面.可是用一段时间就会发现原带的设计器有很多bug,时不时会崩溃,支持的控件数量有限,属性 ...

  4. 使用wait&lpar;&rpar;与notify&lpar;&rpar;实现线程间协作

    调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁.这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中.可以通过notify()/n ...

  5. Linux下运行memcached失败

    Linux下运行memcached失败 1.错误信息如下 [root@localhost ~]# memcached can't run as root without the -u switch 2 ...

  6. 关于hover没有效果的问题

    今天用vs2012写一个页面的是时候,用到hover的效果,原本是没有难度的事情,后来因为一个细节,导致浪费了点时间. 原来是我在css文件里面写完样式后,用了ctrl+k+D进行了格式化,然后vs在 ...

  7. 关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)

    目前国内对于双卡智能手机的需求还是很大的,各种复杂的业务会涉及到双卡模块:而android标准的api又不提供对双卡的支持.导致国内双卡模块标准混乱,各个厂商各玩各的.目前我知道的双卡解决方案就有:m ...

  8. visual studio 2013常用快捷键 VS2013快捷键大全

    visual studio 2013常用快捷键 VS2013快捷键大全   Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具 ...

  9. spark-shell报错:Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;NoClassDefFoundError&colon; org&sol;apache&sol;hadoop&sol;fs&sol;FSDataInputStream

    环境: openSUSE42.2 hadoop2.6.0-cdh5.10.0 spark1.6.0-cdh5.10.0 按照网上的spark安装教程安装完之后,启动spark-shell,出现如下报错 ...

  10. 二级联动,三级联动,初学者,纯javascript,不含jQuery

    二级联动: html代码: <body> <select id="province" onchange="getCity(this.options.se ...