【ETL实战】kettle分批读取大表数据

前言,虚拟机搭建环境,发现kettle非常占用内存,排查服务器资源情况,发现是polkitd进程

 暂时也没有好的解决方案,目前就是读了一个大表的过滤,之前都是很小的表,没有发现内存占用这么快。

只能采用分页读取,但是kettle里面没有配置分页读取的,只能通过job来实现,下面搜索资料,进入理论实践。

kettle分页循环.kjb

 主job结构:

【1】转换:获取页数.ktr ——用来获取页数表结构

【2】作业:获取参数循环抽数.kjb —— 获取分页数,设置参数,获取参数进行循环抽数。

1.获取源表页数

#取总页数
SELECT ceil(count(1)/5000) as pages FROM  table1

mysql获取行号:SELECT ROW_NUMBER()OVER() from table1;

 

 分页页数要用整数

2.字段选择

 

3.表输入

 

这里会借助rownum 获取一个类似下面这样的表结构

4.字段选择

和步骤2的字段选择设置差不多

5.复制结果到记录

直接拖拽作业控件中的复制记录到结果组件过来连线即可

 

再看第二个作业

这个作业由2个转换组成,一个是设置变量,一个是获取变量加抽数

转换:设置变量

 从结果获取记录

设置变量

 转换:获取变量加抽数

这里就是简单的表输出到表输出,但具体设置有一点区别。

 

表输入

这是最终版的设置,也就是说在设置完表输出之后,要回来将SQL设置成以下内容:

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)

设置全部完成,可以开始跑作业了

Mysql的limit计算语句错误问题

在MySQL里面使用limit (2-1)*10,10是不支持的

中文汉化,时区问题

 #/usr/local/tomcat/bin/setenv.sh

CATALINA_OPTS="-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
JAVA_OPTS="-Duser.language=zh -Duser.region=CN -Dfile.encoding=UTF-8  -Duser.timezone=GMT+08"

最后还要记住,因为要遍历上一次的执行结果,主流程第二个作业要勾选执行每一个输入行

kettle的文件

压缩备份文件

遇到的问题

1,无法执行动态分页

可通过字段计算出来,也可能是自己还不会用

 

 执行计算的变量值类型有误,如limit 0.0,10.0

参数格式一定要用#

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值