ETL工具 - Kettle 案例,拉取网络列表数据

news2024/12/23 7:36:53

一、Kettle 实战案例

上篇文章对 Kettle 的查询、连接、统计、脚本算子进行了介绍,对 Kettle 的大部分算子都应该有了相应的了解,下面我们基于 Kettle 实战案例,拉取 CSDN 博客列表的全部数据,存放至 Excel 文件中。

实验之前先看下 CSDN 列表调用的哪个接口:

在这里插入图片描述

就是这个

https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950

其中 page 参数也就是当前页,size 一页的大小,如果我们要获取全部的数据,肯定需要对这两个参数进行修改。

下面看下返回的结构:

{
    "code": 200,
    "message": "success",
    "traceId": "b1e8ccb0-2e39-4834-bacd-b52a260bb521",
    "data": {
        "list": [
            {
                "articleId": 130450076,
                "title": "ETL工具 - Kettle 查询、连接、统计、脚本算子介绍",
                "description": "连接算子一般将多个数据集通过关键字进行连接,类似 `SQL` 中的连接操作,统计算子可以提供数据的采样和统计功能,脚本算子可以通过程序代码完成一些复杂的操作",
                "url": "https://xiaobichao.blog.csdn.net/article/details/130450076",
                "type": 1,
                "top": false,
                "forcePlan": false,
                "viewCount": 313,
                "commentCount": 0,
                "editUrl": "https://editor.csdn.net/md?articleId=130450076",
                "postTime": "2023-04-30 23:12:13",
                "diggCount": 1,
                "formatTime": "前天 23:12",
                "picList": [
                    "https://img-blog.csdnimg.cn/2e817e14046f4cba9663c89978198f12.png"
                ]
            }
        ],
        "total": 287
    }
}

先不考虑分页的话我们怎么拿到数据呢,首先第一步可以通过 REST client 工具访问该接口获取到数据,然后根据拿到的结果使用 JSON input 进行解析,最后就可以输出到 Excel 文件中了。

那接口是分页的设计,我们怎么获取全部数据呢,下面有三个方案:

  • 直接给个很大的 size ,数据少的情况可以实现不灵活。
  • 每次都获取下一页,递归的形式直到获取的数据为空时停止。
  • 根据接口中的 total 参数,计算出总页数,然后递归的形式对页数进行 +1 ,直到等于最大页。

第一种方案不太灵活,下面我们对二三两个方案进行实践下:

二、递归直到获取数据为空时停止 方案

这里我们定义四个变量,分别如下:

变量初始值说明
page1第几页
flagtrue是否获取数据为空
urlhttps://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950每次请求的url
baseUrlhttps://blog.csdn.net/community/home-api/v1/get-business-list?size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950去除分页参数后的url

先看一下总的任务设计图:

在这里插入图片描述

转换设计图:

在这里插入图片描述

2.1 任务设计过程

使用设置变量添加上面几个变量信息:

在这里插入图片描述

这里我们主要通过 flag 判断是否需要进行下一步,所以使用检验字段的值判断 flag 是否为 true :

在这里插入图片描述

如果为 true 的话就执行转化进行具体的获取数据写数据的操作,这里转换返回的结果把接口返回的 $.data.list 值返回出来:

在这里插入图片描述

如果转换的结果是 [] 就表示获取不到数据了,下面使用 JS 脚本将 flag 的值更新为 false ,下面流转到检验字段的值由于 flagfalse 直接流转到成功结束任务了。

如果转换的结果不是 [] ,那表示还有数据,对 page 进行 +1 操作,然后通过 baseUrl 拼接一个完整的访问接口,替换到原来的 url 变量,实现逻辑如下:

在这里插入图片描述

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");
var preRows=previous_result.getRows();
log.logMinimal('打印日志:'+preRows.size());
log.logMinimal('打印日志:'+preRows.get(0));
var list = preRows.get(0).getString("list", "");
log.logMinimal('打印日志:'+list);
if (list == '[]'){
	parent_job.setVariable('flag', false);
	false
}else{
	var page=parent_job.getVariable('page');
	var baseUrl=parent_job.getVariable('baseUrl');
	page++;
	var url = baseUrl+"&page="+page;
	parent_job.setVariable('page', page);
	parent_job.setVariable('url', url);
	true;
}

2.2 转换设计过程

在转换中首先获取到任务中设定的 url 变量:

在这里插入图片描述

下面使用 REST client 请求接口获取到 JSON 结果集:

在这里插入图片描述

下面使用 JSON input 对结果集进行解析,这里分了两个链路,上面的解析 $.data.list 中具体的字段信息,然后存入到 Excel 中,下面的直接将 $.data.list 值作为转换的结果给到任务:

在这里插入图片描述

2.2.1 存入 Excel 的过程

首先对结果数据进行解析:

在这里插入图片描述

字段这里就对 articleId、title、url、type、postTime 这几个字段进行存储:

名称路径
articleId$.data.list…articleId
title$.data.list…title
content_url$.data.list…url
type$.data.list…type
postTime$.data.list…postTime

在这里插入图片描述
解析出关键字段后,使用字段选择过滤下字段:

在这里插入图片描述

最后写入 Excel 中:

在这里插入图片描述
在这里插入图片描述

2.2.2 返回任务结果的过程

解析出 $.data.list 的值:

在这里插入图片描述

在这里插入图片描述

选择字段信息:

在这里插入图片描述

2.2.3 运行结果

运行任务:

在这里插入图片描述

从日志中可以看到迭代的效果,下面看下输出的结果:

在这里插入图片描述

可以看到已经获取到了全部的数据。

三、计算出总页数,递归对页数进行 +1 直到等于最大页 方案

这种方案相较于上一个方案多一步计算总页数的操作,这里需要定义四个变量,分别如下:

变量初始值说明
page1第几页
totalPage10总页数
urlhttps://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950每次请求的url
baseUrlhttps://blog.csdn.net/community/home-api/v1/get-business-list?size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950去除分页参数后的url

先看一下总的任务设计图:

在这里插入图片描述

获取总条数转换:

在这里插入图片描述

存储数据转换:

在这里插入图片描述

3.1 任务设计过程

使用设置变量添加上面几个变量信息:

在这里插入图片描述

下面通过计算总条数转换获取到总数,实际就是取的返回中的 $.data.total 参数:

在这里插入图片描述

下面通过 JS 脚本计算出总页数,将总页数覆盖变量 totalPage 的值:

在这里插入图片描述

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");
var preRows=previous_result.getRows();
log.logMinimal('打印日志:'+preRows.size());
log.logMinimal('打印日志:'+preRows.get(0));
var total = preRows.get(0).getInteger("total", 0);
log.logMinimal('打印日志:'+total);

var totalPage = total % 20 == 0 ? parseInt(total / 20) : parseInt(total / 20) + 1;

log.logMinimal('打印日志:计算总页数'+totalPage);
parent_job.setVariable('totalPage', totalPage);
true

下面直接判断如果 page 的值小于 totalPage 则就可以执行存储数据的转换操作:

在这里插入图片描述

在这里插入图片描述

在转换执行后,无需拿到转换的结果,直接对 page 进行 +1 操作,并重新生成一个完整的 url 覆盖变量中 url 的值,这里通过 JS 脚本实现:

在这里插入图片描述

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");
var page=parent_job.getVariable('page');
var baseUrl=parent_job.getVariable('baseUrl');
var totalPage=parent_job.getVariable('totalPage');

page++;
parent_job.setVariable('page', page);
log.logMinimal('打印日志:当前分页:'+page+' , 总页数:'+totalPage);
var url = baseUrl+"&page="+page;
parent_job.setVariable('url', url);
true;

下面又指向检验字段的值,一直递归计算。

3.2 获取总条数转换

首先获取到变量的值:

在这里插入图片描述

然后通过 REST client 获取到接口数据:

在这里插入图片描述

下面使用 JSON input 对结果数据进行解析,取出 $.data.total 值:

在这里插入图片描述
在这里插入图片描述

下面通过字段选择,只保留 total 字段:

在这里插入图片描述

最后将该结果作为转换的结果给到任务。

3.3 存入 Excel 过程转换

首先同样获取变量:

在这里插入图片描述

然后通过 REST client 拿到接口数据:

在这里插入图片描述

接着使用 JSON input 拿到关键字段,同样对 articleId、title、url、type、postTime 这几个字段进行存储:

在这里插入图片描述

最后写入到 Excel 中:

在这里插入图片描述

3.4 运行结果

运行任务:

在这里插入图片描述

从日志中可以看到迭代的效果,下面看下输出的结果:

在这里插入图片描述
可以看到同样获取到了全部的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NECCS|全国大学生英语竞赛C类|词汇和语法|词汇题|21:03~21:53

词汇题 语法题 情景对话题 目录 一、词汇题 1. 基本词义辨析题 2. 同义词或近义词辨析题 3. 固定搭配 二、常见词组 一、词汇题 1. 基本词义辨析题 appropriate funds 拨款 slum- clearance programme 贫民窟清理计划 reject 拒绝接受&…

DAY 49 tomcat服务配置优化

什么是Tomcat Tomcat是Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的Web应用服务器,是Apache 软件基金会的 Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及人共同开发而成。 Tomcat属于轻量级应用服务器&#xff0…

外卖项目优化-02-

文章目录 瑞吉外卖项目优化-Day02课程内容前言1. MySQL主从复制1.1 介绍1.2 搭建1.2.1 准备工作1.2.2 主库配置1.2.3 从库配置 1.3 测试 2. 读写分离案例2.1 背景介绍2.2 ShardingJDBC介绍2.3 数据库环境2.4 初始工程导入2.5 读写分离配置2.6 测试 3. 项目实现读写分离3.1 数据…

深入解析PyTorch中的基本数据结构:张量的维度、形状和数据类型

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

【LEAP模型】能源环境发展、碳排放建模预测及不确定性分析

本次内容突出与实例结合,紧密结合国家能源统计制度及《省级温室气体排放编制指南》,深入浅出地介绍针对不同级别研究对象时如何根据数据结构、可获取性、研究目的,构建合适的能源生产、转换、消费、温室气体排放(以碳排放为主&…

【Spring框架全系列】Spring更简单的读取和存储对象

📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的读取和存储对象。 &#x1f…

从源码角度看Linux进程组和线程组

1.进程ID 线程组ID: 设置了CLONE_THREAD flag创建的进程(线程)同属于同一个线程组,拥有同一个线程组ID(TGID)。pthread_create创建线程的时候,底层通过clone函数实现就指定了CLONE_THREAD参数,即一个进程中的各个线程…

前端搭建猜数字游戏(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分✨ 完整代码 ✨ 写在前面 上周我们实通过前端基础实现了打字通,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我…

架构设计-数据库篇

大家好,我是易安! 之前我们讲过架构设计的一些原则,和架构设计的方法论,今天我们谈谈高性能数据库集群的设计与应用。 读写分离原理 读写分离的基本原理是将数据库读写操作分散到不同的节点上,下面是其基本架构图。 读…

【ansys】project may be corrupted and recovery information is available

一、问题背景 在网上找一个fluent算例打算在自己机器上运行。 打开fluent求解器,因为路径上有中文,在求解计算的时候出错了。 于是我通过任务管理器强制退出fluent和workbench程序,再将项目文件复制到一个没有中文的目录路径中。 重新打开…

15-2-线程-线程的创建,等待,退出

一、相关API 1. 线程创建 1. 线程创建 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);参数&#xff1a;参数1&#xff1a;&#xff08;创建的线程 的地址…

【JavaEE】TCP回写服务器简易翻译服务器(网络编程)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 上一篇我们讲解了UDP回写服务器和简易翻译服务器&#xff0c;想了解本篇文章&#xff0c;建议先看看上篇文章&#xff0c;学起来会更容易一些~~传送门&#xff1a;(1条消息) 【JavaEE】UDP数…

创新案例|香氛新品牌观夏如何以DTC模式仅4年实现年收过亿

国产香氛品牌观夏的DTC战略&#xff0c;正是从产品创新、全渠道布局、社交电商营销等方面创新&#xff0c;实现更高效地直接触达和转化消费者。观夏作为香氛DTC品牌的创新模式值得更多国内新品牌的关注与借鉴&#xff0c;同时也能为传统品牌的DTC转型提供全球化视野的启示。 1.…

改进YOLOv8: | ICLR 2022 | 涨点神器!Intel提出ODConv:即插即用的动态卷积 | 轻量化涨点创新必备

OMNI-DIMENSIONAL DYNAMIC CONVOLUTION ODConv实验核心代码修改文件yaml文件运行论文链接: https://openreview.net/forum?id=DmpCfq6Mg39 本文介绍了一篇动态卷积的工作:ODConv,其通过并行策略采用多维注意力机制沿核空间的四个维度学习互补性注意力。作为一种“即插即用…

3。数据结构(1)

嵌入式软件开发第三部分&#xff0c;各类常用的数据结构及扩展&#xff0c;良好的数据结构选择是保证程序稳定运行的关键&#xff0c;&#xff08;1&#xff09;部分包括数组&#xff0c;链表&#xff0c;栈&#xff0c;队列。&#xff08;2&#xff09;部分包括树&#xff0c;…

使用rt thread studio新建一个rt thread工程的详细操作说明(以stm32F411CEU6)为例

新建工程 这里以rt thread 5.0以及stm32F411CEU6芯片为例&#xff0c;创建工程 先建一个工作空间 .metadata是建工作空间自己生成的。 这时候&#xff0c;工作空间是空的&#xff0c;没有项目: 新建项目 首先下载RT-thread源文件和芯片支持包&#xff1a; 2023.05.02&#x…

NOIP2000 提高组 方格取数 线性DP 坐标优化 全局最优

&#x1f351; 算法题解专栏 &#x1f351; [NOIP2000 提高组] 方格取数 题目描述 设有 N N N \times N NN 的方格图 ( N ≤ 9 ) (N \le 9) (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0 0 0。如下图所示&#xff08;见样…

延时队列的三种实现方案

延时队列的三种实现方案 什么是延时队列延时队列的应用场景基于Java DelayQueue的实现源码剖析 基于Redis的zset实现实现步骤Redis延时队列优势Redis延时队列劣势 基于RabbitMQ的延时队列实现TTL DXL(死信队列)插件实现 总结参考文章 什么是延时队列 在分布式系统中&#xff…

Go(二):包管理、通道、协程并发、互斥锁基础

包管理、协程并发基础 生成包管理文件go-mod第一步&#xff08;初始化创建包管理文件&#xff09;第二步&#xff08;导入包&#xff09; 常用命令导入远程包&#xff08;示例&#xff1a;gin&#xff09;第一步&#xff08;导入包&#xff09;第二步&#xff08;安装包&#x…

操作系统之进程同异步、互斥

引入 异步性是指&#xff0c;各并发执行的进程以各自独立的、不可预知的速度向前推进。 但是在一定的条件之下&#xff0c;需要进程按照一定的顺序去执行相关进程&#xff1a; 举例说明1&#xff1a; 举例说明2: 读进程和写进程并发地运行&#xff0c;由于并发必然导致异步性…