目录
kettle案例
/    

kettle案例

国内镜像下载地址: http://mirror.bit.edu.cn/pentaho/Pentaho+8.2/client-tools/

pdi-ce-8.2.0.0-342.zip

启动spoon.bat

  1. 将数据库驱动放到kettle8.2\data-integration\lib下
  2. MySQL8.0的时候 自定义配置

image.png

jdbc:mysql://localhost:3306/express?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
com.mysql.cj.jdbc.Driver

image.png

DKiOFx.png

DKF1kq.png

  • 新建转换

输入 -> 表输入 拖到游标

image.png

双击表输入

image.png

输出 -> 表输出 拖到右边

DKihWT.png

DKFY1U.png

DKG27t.png

DKmbid.png

DKFy9K.png

DKAiJP.png

摘抄

http://www.kettle.net.cn/2460.html

转换

转换包括一个或多个步骤,步骤之间通过跳(hop)来连接。跳定义了一个单向通道,允许数据从一个步骤流向另一个步骤。在Kettle中,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤的移动。

一个步骤的数据发送可以设置为轮流发送和复制发送;轮流发送:将数据行依次发给每一个输出跳;复制发送:将全部数据行发送给所有输出跳。(shift + 鼠标左键 可以快速地新建一个跳)

?? 在Kettle中,所有的步骤都以并发的方式执行,当转换启动后,所有的步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了。数据行:一个数据行是零到多个字段的集合。

  1. 转换。Kettle在运行转换的时候,根据用户的设置,可以将数据以不同的方式发送到多个数据流中。
    注意:有两种基本发送方式,即分发和复制,分发类似于发扑克牌,以轮流的方式将每行数据只发给一个数据流。复制是将一行数据发给所有数据流。
  2. 转换。转换以并行的方式执行,就需要一个可以串行执行的作业来处理这些操作(作业以串行执行)。
  3. 转换。是ETL解决方法中最主要的部分,它处理抽取,转换,加载各阶段各种对数据行的操作。转换包括一个或者多个步骤(step),如读取文件,过滤输出行,数据清洗或者将数据加载到数据库。转换里面的步骤通过跳(hop)来连接,跳定义了一个单向通道,允许数据从一个步骤向另一个步骤流动。在Kettle里面,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤的移动。数据流的另一个同义词就是记录流。注意,转换里面还可以包含注释,注释一个小的文本框,可以放在转换流图的任何位置。注释的主要目的是使转换文档化,方便自己以后熟悉和学习。
  4. 转换。转换的注意点,步骤是转换里面的基本组成部分,它以图标的方式图形化的展示。一个步骤有如下几个关键特性。步骤需要有一个名字,且这个名字在转换范围里唯一。步骤将数据写到与之相连的一个或者多个输出跳(outgoing hops),再传送到跳的另一端的步骤。对另一端步骤来说这个跳就是一个输入跳(incoming hops),步骤通过输入跳接受数据。大多数的步骤都可以有多个输出跳。一个步骤的数据发送可以被设置为轮流发送和复制发送。轮流发送是将数据行依次发给每一个输出跳(这种方式也称为round robin),复制发送是将全部数据行发送给所有输出跳。在运行转换的时候,一个线程运行一个步骤和步骤的多份拷贝,所有的步骤的线程几乎同时运行,数据行连续的流过步骤之前的跳。
  5. 转换的跳。跳(hop)就是步骤之间带箭头的连线跳定义了步骤之间的数据通路。跳实际上是两个步骤之间的被成为行集(row set)的数据行缓存(行集的大小可以在转换的设置里面定义)。当行集满了,向行集写数据的步骤将停止写入,直到行集里又有了空间。当行集空了,从行集读取数据的步骤停止读取,直到行集里面又有了可读的数据行。注意,当创建新跳的时候,需要记住跳在转换里面不能循环。因为在转换里面每个步骤都依赖前一个步骤获取字段值。
  6. 转换的并行。跳的这种基于行集缓存的规则允许每个步骤都由一个独立的线程运行,这样并发程度最高。这一规则也运行数据以最小消耗内存的数据流的方式来处理。在数据仓库里面,我们经常要处理大量数据,所以这种并发低耗内存的方式也是ETL工具的核心需求。对于kettle,不可能定义一个执行顺序,不可能也没有必要确定一个起点和终点。因为所有步骤都以并发方式执行。当转换启动后,所有步骤都同时启动,从他们的输入跳中读取数据,并把处理过的数据都写到输出跳,直到输入跳里面不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了,也就是说,从功能的角度来看,转换也有明确的起点和终点。注意,转换里面的步骤几乎是同时启动的,所有如果想要一个任务沿着指定的顺序执行,那么就要使用作业(job)了。
  7. 转换的设计。当设计转换的时候有几个数据类型的规则需要注意。行级里所有行都应该有同样的数据结构。就是说,当从多个步骤向一个步骤里面写数据的时候,多个步骤输出的数据行应该有相同的结构,即字段相同,字段数据类型相同,字段顺序相同。字段元数据不会在转换中发生变化。意思就是说,字符串不会自动截取长度以适应指定的长度,浮点数也不会自动取整以适应指定的精度。这些功能必须通过一些指定的步骤来完成。默认情况下,空字符串””,被认为与NULL相同。

作业

  1. 无条件执行:不论上一个作业项执行成功与否,下一个作业项都会执行。标识为,黑色的连线,上面有一个锁的图标
  2. 当运行结果为真时执行:标识为,绿色的连线,上面有一个钩号
  3. 当运行结果为假时执行:标识为,红色的连线,上面有一个红色的停止图标

Kettle使用回溯算法来执行所有的作业项。即执行中的某条路径的某个节点时,要依次执行这个节点的所有子路径,直到没有再执行的子路径,就返回该节点的上一个节点,在反复该过程。

注意:在作业中定义的跳 是控制流,在转换中定义的 跳 是数据流

作业(job)。作业按照一定的顺序完成,因为转换以并行方式执行的,就需要一个可以串行执行的作业来处理一系列按照顺序完成的操作。一个作业包括一个或者多个作业项,这些作业项以某种顺序来执行。作业执行顺序由作业项之间的跳(job hop)和每个作业项的执行结构来决定。如同转换,作业里面也可以包括注释。

作业项。作业项是作业的基本构成部分。如同转换的步骤,作业项也可以使用图标的方式图形化展示。作业项的注意点。新步骤的名字应该是唯一的,但是作业项可以有影子拷贝。这样可以把一个作业项放在不同的位置。这些影子拷贝里的信息都是相同的,编辑一份拷贝,其他拷贝也会随之修改。在作业项之间可以传递一个结果对象(result object)。这个结果对象里包含了数据行,它们不是以流的方式来传递的。而是等一个作业项执行完了,再传递给下一个作业项。默认情况下,所有的作业项都是以串行方式执行的,只是在特殊情况下,以并行方式执行。

案例一:rest请求数据存入数据库

来自:https://www.xiaominfo.com/2019/08/08/kettle-2/

  • 创建数据库
CREATE TABLE `163_comment`  (
  `user_id` bigint(30) NOT NULL,
  `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `like_count` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

{
    "status":"success",
    "comments":[
        {
            "userId":417806867,
            "nickname":"十豆彡睡醒了",
            "avatarUrl":"http://p1.music.126.net/S4hK1tGib1ZZ_TeJlIKjnQ==/109951164247946247.jpg",
            "content":"你们找到要一起跨年的人了吗?",
            "likedCount":105909,
            "time":"2019年12月26日 21:04:15"
        },
        {
            "userId":334831709,
            "nickname":"CAIIXNA4I",
            "avatarUrl":"http://p1.music.126.net/CI39l70i2vsh0exdS0v5kQ==/109951164051989776.jpg",
            "content":"玫瑰在离开小王子的时候说:我当然爱你 没有让你感受到 是我的不对",
            "likedCount":105109,
            "time":"2019年12月26日 20:32:39"
        },
        {
            "userId":83085519,
            "nickname":"Peanut-s1",
            "avatarUrl":"http://p1.music.126.net/WNtp2GqdxF9xUQ5Wlqxhaw==/109951165418080735.jpg",
            "content":"小王子还说:可是 我毕竟是太年轻了 不知道该如何爱她",
            "likedCount":67906,
            "time":"2019年12月27日 00:42:41"
        },
        {
            "userId":1452517499,
            "nickname":"彬的自然卷",
            "avatarUrl":"http://p1.music.126.net/I6KIukGBIyjmGIXWrX9_pg==/109951163837907454.jpg",
            "content":"温柔的人总是很自卑吧",
            "likedCount":60441,
            "time":"2019年12月28日 19:24:43"
        },
        {
            "userId":579412866,
            "nickname":"妈妈老催我起床",
            "avatarUrl":"http://p1.music.126.net/zqo-DxAzMTORLKI8ODqalQ==/109951165226589250.jpg",
            "content":"“后来这个笨手笨脚的小孩子还是选择了自己把剩下的路走完。”",
            "likedCount":48880,
            "time":"2019年12月28日 00:14:09"
        },
        {
            "userId":347256737,
            "nickname":"她的水彩笔",
            "avatarUrl":"http://p1.music.126.net/XU6gBWHKvXYyZ56NzrNXQg==/109951164873146235.jpg",
            "content":"“奔向你的时候 途经的一切事物都觉得很可爱”",
            "likedCount":42532,
            "time":"2019年12月26日 22:45:23"
        },
        {
            "userId":288563327,
            "nickname":"那你有没有想我喔",
            "avatarUrl":"http://p1.music.126.net/cnmNuuM91Bb3OE_HF_77tg==/109951165410307038.jpg",
            "content":"不是双向的奔赴毫无意义",
            "likedCount":41305,
            "time":"2019年12月28日 11:55:26"
        },
        {
            "userId":1532641551,
            "nickname":"喝热水吗你",
            "avatarUrl":"http://p1.music.126.net/uHnuXkVL8IO3TIZFCZmqYw==/109951164860013328.jpg",
            "content":"“我要把对你的喜欢放一放了,你先等等我,等我的成绩追上你,等一百六十八天后,我再告诉你我对你的这份挂念好不好”",
            "likedCount":33784,
            "time":"2019年12月28日 09:11:08"
        },
        {
            "userId":251109628,
            "nickname":"xD-7",
            "avatarUrl":"http://p1.music.126.net/-1qU8ddf2eqTttkww6WM7g==/109951163905374898.jpg",
            "content":"“要知道像2020这样ABAB的年份,每隔101年才会出现一次,比一个世纪还长。所以很开心能和你共同度过其中一个。 ” ",
            "likedCount":24269,
            "time":"2020年01月03日 21:08:51"
        },
        {
            "userId":1328555812,
            "nickname":"养一只月亮可不可以呀",
            "avatarUrl":"http://p1.music.126.net/zyQ5g0dROnPBlaLUnGTEfA==/109951164002581783.jpg",
            "content":"宇航员在浩瀚宇宙数星星 我透过窗子对月亮许愿今晚能够梦到你 ",
            "likedCount":24173,
            "time":"2019年12月26日 21:59:15"
        },
        {
            "userId":546121400,
            "nickname":"秋落170720",
            "avatarUrl":"http://p1.music.126.net/B1R2FmesAuTE3hu4cI_aTg==/109951164581790668.jpg",
            "content":"你确定这就是爱吗
真的爱我吗
手牵着手漫步斜阳
就当作浪漫
两个人眺望远方
以为爱的晴朗
当我回头望
却已泪湿了眼眶
当夕阳变成星光
当爱情换了方向
你一如过往对爱太紧张
但未来又会怎样
未知的明天总让我彷徨
谁给我力量
我不怕你爱不爱我
只害怕你以为爱我
抓紧我不算拥有
你总学不会放手
我不怕你",
            "likedCount":21395,
            "time":"2019年12月26日 21:50:05"
        },
        {
            "userId":2005436838,
            "nickname":"冰淇零1随缘",
            "avatarUrl":"http://p1.music.126.net/1O_Vdf2uhQUUlTi9EWhuuA==/109951164542960008.jpg",
            "content":"我本就不是一个主动的人 灵魂虽然有趣 可不爱表达 还死犟 也慢热 遇到懂我的人很幸运 遇不到也正常",
            "likedCount":15024,
            "time":"2019年12月28日 00:15:59"
        },
        {
            "userId":478268688,
            "nickname":"芒果藏起来",
            "avatarUrl":"http://p1.music.126.net/XdRytMyZryMstUK5NmnVGA==/109951165423178491.jpg",
            "content":"你口口声声说你爱我 很爱我 最爱的也是我 可是却一边做着伤害我的事情 让我痛不欲生 你确定这就是爱吗?真的爱我吗?",
            "likedCount":14889,
            "time":"2019年12月27日 00:56:04"
        },
        {
            "userId":1916977223,
            "nickname":"---小呂",
            "avatarUrl":"http://p1.music.126.net/LGg0eH7lfoKZYT9sd-hc5w==/109951165384383034.jpg",
            "content":"你确定这就是爱吗
真的爱我吗
手牵着手漫步斜阳就当作浪漫
两个人眺望远方
以为爱的晴朗
当我回头望 却已泪湿了眼眶
当夕阳变成星光
当爱情换了方向
你一如过往
对爱太紧张
但未来又会怎样
未知的明天总让我彷徨
谁给我力量
我不怕你爱不爱我
只害怕你以为爱我
抓紧我不算拥有
你总学不会放手",
            "likedCount":4995,
            "time":"2019年12月26日 21:49:09"
        },
        {
            "userId":111821579,
            "nickname":"你是我的温澜如风",
            "avatarUrl":"http://p1.music.126.net/1tK09IO7vn5RCv1eO8zubw==/109951164450051475.jpg",
            "content":"自卑的人为什么那么温柔,内向的人为什么那么安静。",
            "likedCount":4692,
            "time":"2019年12月28日 22:19:25"
        }
    ]
}

最终结果图

image.png

  • 创建一个转换

定义变量

输入 -> 生成记录

image.png

配置REST Client组件

查询 -> REST client

image.png

定义JSON输入流

输入 -> JSON input

image.png

image.png

解析json串

如果是这种形式

[{
	"a": "1"
}]

获取的时候 使用 $.[*].a

{
	"a": "1"
}

获取的时候,使用 $.a

字段选择

转换 -> 字段选择

image.png

数据入库

输出 -> 插入/ 更新

image.png

最后直接执行

image.png

image.png


标题:kettle案例
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2020/11/19/1605780880267.html