采用 Kettle 分页处理大数据量抽取任务
采用 Kettle 分页处理大数据量抽取任务
作者:Grey
原文地址:
需求#
将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
来构造
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).
解决办法:
作者:GreyZeng
出处:https://www.cnblogs.com/greyzeng/p/5524614.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
你可以在这里自定义其他内容
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/5524614.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库