再谈kettle两种循环之 – 调用http分页接口循环获取数据
1.场景介绍:
由于数据量比较大,接口有返回限制,需要用到循环分页获取数据
2.案例适用范围:
循环job可参考,变量运用可参考,调用http分页接口循环获取数据可参考,生成连续记录可参考,MD5加密可参考
3.整个job设置如下设计:
循环方式1
循环方式2
4.JOB运行结果
调用接口返回总数据量:
循环方式1
循环方式2
两种循环分页获取方式结果和实际接口数据一致,代表循环分页获取接口数据的过程正确
5.JOB过程分步骤介绍
循环方式1的设计主要有4个步骤
- Execute SQL Script组件清空表数据,目的是支持重跑
主要是获取数据总量,根据设置每页数量计算循环次数(数据有多少页就循环多少次)
-
Evaluating JavaScript 组件主要是根据页数控制循环
-
GET_HOUSE_DATA转换获取数据
表输入:这里采用数据库连接,运用sql的方式生成http接口调用信息,框出来部分是循环变量替换的关键设置
MD5加密及获取token步骤这里不细说具体可以参考之前的文章kettle使用MD5加密增量获取接口数据
接口根据request_body设置分页请求数据,然后解析入库
总结:循环方式1的设计关键在于javascript控制循环,需注意数据量太大,循环次数过多会报内存溢出的错误,经过测试大概在循环200次左右会报错,数据量不是特别建议用这种方式
循环方式2的设计主要也是4个步骤
- Execute SQL Script组件清空表数据,目的是支持重跑和循环1设计一致
- SET_TOTAL_NUM转换设计和循环1也一样
- GENERATE_LOOP_ROWS转换主要是根据页数生成循环的页数和每页数量的结果列表,结果列表如下
过程设置如下:
- GET_HOUSE_DATA转换获取数据设计和循环1一样
总结:循环的设计可以解决循环1内存溢出的问题,该设计关键在于需要在job中勾选GET_HOUSE_DATA转换的两个勾以及设置参数传递(Options 下的Execute every input row和Parameters下的Copy results to parametes)
整个设计作者亲自测试过,没有问题,如大家在使用过程中发现不能成功,可以检查一下每个步骤中是否有遗漏,如内容描述有错欢迎大家指正!!!
读后有疑问请加QQ群来聊一聊 kettle那些事!作者个人qq:420773639
因资源涉及到API具体信息作者这里就不直接公布,如果有需要可以联系作者