作者: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分页处理大数据量抽取任务的更多相关文章

  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.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. [后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs

    一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来打造一个单页面程序,后面一篇文章将介绍如何使用AngularJs的开发一个单页面应用 ...

  2. 【Bugly干货分享】老司机教你 “飙” EventBus 3

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. EventBus对于Android ...

  3. AndroidPn源码分析(一)

    好了,开始研究源码了.目前对androidpn,只限于使用过它,跑了一下demo.现在开始研究一下源码. (一)入口 当服务器端启动的时候,控制台会打印一些log,除了spring和hibernate ...

  4. C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.

    C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...

  5. Atitit 微信支付 支付结果通用通知

    Atitit 微信支付 支付结果通用通知 Wechat hto sh ma  返回页面return_url - 熊佳佳的博客 d ,only notyfi url-... 接口链接 该链接是通过[统一 ...

  6. Java面试(1)-- Java赋值表达式

    1 class Demo01{ 2 public static void main(String[] args){ 3 //赋值运算符 = 4 5 //例1 6 int a = 1; 7 System ...

  7. How Google TestsSoftware - The Life of a SET

    SETs are Software Engineersin Test. They are software engineers who happen to write testing function ...

  8. SAP Business One系统功能介绍

    SAP Business One(简称SAP B One)是一套价格合理.易于实施的综合业务管理解决方案.该解决方案专为中小型企业量身打造,可确保实现公司发展.提高可盈利性和控制力度以及实现业务流程的 ...

  9. CSS隐藏元素的N种实现方式。

    1. width:0; 光有高度是不行的,还得有宽度.缺点文字隐藏不了,可以加个color:#fff和背景颜色一样就ok了,障眼法,迷惑人的,其实内容还在,如果有文字的话,还是可以触发点击事件的,这种 ...

  10. ASP.NET MVC中使用FluentValidation验证实体

    1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的 ...