Kettle 循环调用接口分页插入数据库(保姆级教程)

AI6天前发布 beixibaobao
13 0 0

Kettle 循环调用接口分页插入数据库(保姆级教程)

前言

最近在做数据同步的需求,对方提供了一个 HTTP 接口,需要把接口返回的数据全部拉取下来存到我们自己的数据库里。数据量还挺大的,一次性返回肯定不行,只能分页调用。

之前没用过 Kettle 做这种场景,折腾了一番总算搞定了,把过程记录下来分享给大家。


一、需求分析

先说下要做什么:

  1. 调用第三方 HTTP 接口获取数据
  2. 接口支持分页,每页返回一定数量的数据
  3. 把所有页的数据都取出来,存到数据库表中

整体思路就是:循环调用接口 → 解析 JSON → 入库,用 Kettle 的转换+作业来实现。


二、具体步骤

步骤 0:接口调用结构

在这里插入图片描述


返回参数如下json

{
    "code": 0,
    "msg": "操作成功",
    "data": {
        "records": [
            {
                "id": "000b2bdd2629ef7ea46c0a3ed4bd0d47",
                "labelId": "681ae4e632432232a96f42a9df36ce0",
                "itemId": "59ff4254231bdca4a176520661",
                "createTime": "2026-06-22 12:56:55",
                "updateTime": "2026-06-22 12:56:55"
            },{}···
        ],
        "total": 6967,
        "size": 100,
        "current": 1,
        "orders": [],
        "searchCount": true,
        "pages": 70
    }
}

打开 Kettle(PDI),新建一个转换,后面所有的数据处理逻辑都在这个转换里完成。

在这里插入图片描述


查询总条数

在这里插入图片描述


步骤 1:定义变量参数

这一步很关键!我们需要定义几个变量来控制分页:

在这里插入图片描述

  • page:当前页码,从 1 开始
  • limit:每页多少条数据
  • total:总页数

右键转换空白处 → 转换设置 → 命名参数,把这些变量定义好。


步骤 2:拖入 HTTP 组件

在这里插入图片描述

在左侧核心对象里找到 HTTP client 组件,拖到画布上。这个组件用来发 HTTP 请求。


步骤 3:配置 HTTP 请求

在这里插入图片描述

双击 HTTP client 组件进行配置:

URL 地址:

http://xxx/api/data?page=${page}&size=${pageSize}

这里用 ${变量名} 的方式引用我们之前定义的参数。

请求头:
如果接口需要认证,记得在请求头里加上 Token 之类的:

Authorization: Bearer xxx
Content-Type: application/json

步骤 4:添加 JSON Input 解析数据

在这里插入图片描述

HTTP 返回的是 JSON 字符串,需要解析。拖入 JSON input 组件,连接到 HTTP client 后面。$.data.total获取总数


步骤 5:获取到总数之后计算页数用JavaScript脚本

在这里插入图片描述


步骤 6:设置变量以供后续逻辑使用

在这里插入图片描述


步骤 7:检查current_page是否满足循环条件,如果满足则继续

在这里插入图片描述


步骤 8:开始具体调用逻辑,跟前置获取total相似,包括数据库保存

在这里插入图片描述


步骤 9:更新current_page,通过JavaScript脚本设置变量

在这里插入图片描述


// 获取当前变量值(注意:若变量未定义,需先初始化)
var currentPage = parseInt(parent_job.getVariable("current_page"));
var batchSize = parseInt(parent_job.getVariable("batch_size"));
// 变量自增
currentPage = currentPage + 1;
// 更新变量
parent_job.setVariable("current_page", currentPage.toString());
// 必须返回true,否则无法流转至下一个节点
true;

思路是这样的:

  1. 先调用一次接口拿到总条数,算出总页数
  2. 然后循环执行转换,每执行一次 page+1
  3. 直到 page > totalPage 时停止

可以用 JavaScript 脚本计算器 组件来实现 page 自增,用 检测字段值 组件判断是否继续。

获取方式:百度网盘(国内推荐)

  • 文件名循环调用接口保存数据库.zip
  • 链接:https://pan.baidu.com/s/1mrmWvkiHox0lavt3vKKiMQ
  • 提取码fpve

总结

以上就是用 Kettle 调用 HTTP 接口分页同步数据的完整过程。整体思路其实不难,就是把传统的 ETL 思路用在 API 数据源上。

如果大家在实际操作中遇到问题,欢迎评论区留言讨论!


参考链接:

  • Kettle 官方文档
  • JSONPath 语法教程
© 版权声明

相关文章