采用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 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).
解决办法:
转载于:https://www.cnblogs.com/lcword/p/9570719.html
采用Kettle分页处理大数据量抽取任务相关推荐
- kettle分批处理大表数据_采用Kettle分页处理大数据量抽取任务
需求: 将Oracle数据库中某张表历史数据导入MySQL的一张表里面. 源表(Oracle):table1 目标表(MySQL):table2 数据量:20,000,000 思路: 由于服务器内存资 ...
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
SQL语句: BULK INSERT dbo.table FROM 'e:/test.tbl ' WITH ( ...
- 大数据量分页查询方法(转)
本文旨在介绍一种对数据库中的大数据量表格进行分页查询的实现方法,该方法对应用服务器.数据库服务器.查询客户端的cpu和内存占用都较低,查询速度较快,是一个较为理想的分页查询实现方案. 1.问题的提出 ...
- mysql大数据量分页的一些做法
随着公司业务的增长,数据库的数据也呈指数级增长,拿订单表为例,之前公司的订单表每天只有几千个,一个月下来不超过十万.而现在每天的订单大概就是2w+,目前订单表的数据已经达到了700w.这带来了各种各样 ...
- MySQL 和 Oracle 大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- Oracle大数据量分页通用存储过程
type refCursorType is REF CURSOR; --游标类型定义,用于返回数据集 /*********************************************** ...
- MySQL大数据量分页查询方法及其优化
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 链接:ht ...
- 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- 大数据量分页存储过程效率测试附代码
在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话. 测试环境 硬件:CPU 酷睿双核T5750 内存:2G 软件:Windows serv ...
- mysql一样的查询在我本地很快但是线上很慢_MySQL大数据量分页查询方法及其优化...
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
最新文章
- EM(期望最大化)算法初步认识
- 计算机缺乏内存将无法运行,电脑增加内存为什么无法启动
- list对oracle结果集排序了_详解SQL窗口函数和分组排序函数
- 在基于Spring MVC的应用程序中配置favicon.ico
- intel i218v千兆网卡 linux驱动,适用于英特尔® 千兆位以太网网络连接的 Linux* 基础驱动程序...
- 更改盘符不成功_DVD光驱不读盘怎么解决?DVD光驱能刻录吗
- 本地缓存Caffeine
- Mybatis 框架源码解读(详细流程图+时序图)
- idea 2017 创建java_IDEA2017.3.3创建第一个javaweb项目及tomcat部署实战
- C++提高部分_C++类模板与函数模板的区别---C++语言工作笔记088
- java接口构造方法吗_Java中抽象类和接口中有构造方法吗?
- babel-preset-env使用介绍
- java web项目个人博客_javaWeb项目个人博客系统
- OpenCV-利用其它widthStep方法把interest——img的所有像素值增加200
- matlab数据变成一列数据,用MATLAB处理EXCEL中一列共100000个数据,请问如何将数据导入并将数据做正态曲线拟合...
- 千月影视APP前端搭建_②_创建APP应用
- Android上Excel编辑器,Excel表格编辑app
- LINUX操作命令汇总(zt)
- PPT模板,背景图片,等等(千图网大礼包)
- c++模板:typename的使用
热门文章
- sourcetree使用说明
- 实现链表的增删改查java代码_用Java语言实现链表的增删改查
- 通过 Hibernate 调用存储过程
- 高并发消息队列常用通知机制
- 学生用的笔记本电脑什么样的好_最适合2020年看的选购指南:这些笔记本电脑便宜又好用...
- Java	Script之创建对象
- SpringBoot + Eureka启动失败
- 国家开放大学2021春1078复变函数题目
- PyTorch并行与分布式(二)分布式通信包torch.distributed
- PyCharm 配置 Git 教程