采用Kettle分页处理大数据量抽取任务
作者: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
流程说明:
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).
解决办法:
采用Kettle分页处理大数据量抽取任务的更多相关文章
- MySQL分页查询大数据量优化方法
方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...
- 参考 ZTree 加载大数据量。加载慢问题解析
参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...
- 大数据量报表APPLET打印分页传输方案
1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...
- 大数据量下,分页的解决办法,bubuko.com分享,快乐人生
大数据量,比如10万以上的数据,数据库在5G以上,单表5G以上等.大数据分页时需要考虑的问题更多. 比如信息表,单表数据100W以上. 分页如果在1秒以上,在页面上的体验将是很糟糕的. 优化思路: 1 ...
- MySQL大数据量快速分页实现(转载)
在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢? 般刚开始学SQL语句的时候,会这 ...
- MySQL大数据量分页查询
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- 【1】MySQL大数据量分页查询方法及其优化
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...
随机推荐
- 【Win10 UWP】后台任务与动态磁贴
动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...
- ehcache基本使用
maven <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache< ...
- SQL Server 存储(3/8):理解GAM和SGAM页
我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...
- 作业三:代码规范、代码复审、PSP
一.代码规范 我认为我们编写的代码都需要进行规范的操作,因为如果为了图省事情或者为了减少时间去完成这个编程.在最后检验的时候就会出现一些警告,导致你这次编程的代码出现问题,当出现问题的时候你在回头去检 ...
- js模版引擎handlebars.js实用教程——each-循环中使用this
返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...
- 线程池ThreadPool知识碎片和使用经验速记
ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...
- js菜单默认选中
function defaultSelected() { var curr = $("#leftTree li[onclick*='" + $("#content_ifr ...
- Java基础之泛型
泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...
- Bootstrap~大叔封装的弹层
回到目录 对于Bootstrap的弹层,插件有很多,今天主要用的是它自带的功能,通过bootstrap提供的模式窗口来实现的,而大叔主要对使用方法进行了封装,开发人员可以自己动态传入弹层的HTML内容 ...
- 《PHP Manual》阅读笔记1
1.phpinfo() 从 PHP 获取系统信息. 2.$_SERVER 只是 PHP 自动全局化的变量之一.它包含了 web 服务器提供的所有信息,被称为超全局变量. 3.htmlspecialch ...