使用 Kettle 完成数据 ETL

文章目录

  • 使用 Kettle 完成数据 ETL
  • 数据清洗
  • 数据处理

使用 Kettle 完成数据 ETL

现在我们有一份网站的日志数据集,准备使用Kettle进行数据ETL。先将数据集加载到Hadoop集群中,然后对数据进行清洗,最后加载到Hive中。

在本地新建一个数据集文件weblogdata.txt,文件内容如下所示:

2018-10-01 10:00:00,"http://www.example.com/path/to/page1.html",192.168.1.1,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:01,"http://www.example.com/path/to/page2.html",192.168.1.2,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:02,"http://www.example.com/path/to/page3.html",192.168.1.3,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:03,"http://www.example.com/path/to/page4.html",192.168.1.4,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:04,"http://www.example.com/path/to/page1.html",192.168.1.1,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:05,"http://www.example.com/path/to/page1.html",192.168.1.2,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:06,"http://www.example.com/path/to/page2.html",192.168.1.3,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
2018-10-01 10:00:07,"http://www.example.com/path/to/page3.html",192.168.1.1,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

字段说明如下:

  • timestamp:时间戳,格式为“yyyy-MM-dd HH:mm:ss”。
  • url:网页 URL。
  • ip:访问该网页的 IP 地址。
  • useragent:访问该网页的用户代理(即浏览器)

在之前创建的作业中,点击“核心对象”标签,选择“通用”下面的“START”,拖曳1个“START”控件到右侧的设计区域。

在左侧项目栏的核心对象中,选择“Big Data”下面的“Hadoop Copy Files”控件,拖曳1个“Hadoop Copy Files”控件到右侧的设计区域。然后,单击“START”控件,在弹出的下拉选项中,选择最右侧的按钮,将箭头拖拽至“Hadoop Copy Files”控件,使得“Hadoop Copy Files”与“START”控件之间建立连接。

在设计区域的“Hadoop Copy Files”控件图标上双击,将会弹出属性设置对话框。编辑属性如下:

  • Source Environment:选择“Local”。

  • 源文件/目录:选择本地文件路径。

  • 通配符:空。

  • Destination Environment:选择“Hadoop local”,这是我们之前已经建立好的Hadoop Clusters 对象。

  • Destination File/Folder:选择 HDFS 上的目录,本例为/input。如果不存才该目录,使用命令“hdfs dfs -mkdir /input”进行创建。

点击“确定”,保存设置后,单击设计区域顶部快捷图标栏的三角形“运行”按钮,开始运行作业。

单击运行按钮以后,会弹出图所示的“执行作业”窗口,单击界面底部的“执行”按钮即可。

执行后,在作业设计区域底部可以看到执行的日志信息和作业度量信息。

如果是没有权限操作 HDFS中的“/input”目录。这也与之前在配置 Hadoop 集群连接的时候,产生“User Home Directory Access”和“Root Directory Access”这两条错误信息的原因一致。我们可以通过配置“/input”目录的权限,来解决此处报错。具体命令如下所示。

[user@hadoop102 ~]$ hdfs dfs -chmod 777 /input

修改完目录权限后,我们再次点击“运行”即可。

运行成功后我们可以在Linux终端中使用如下命令进行查看。

[user@hadoop102 ~]$ hdfs dfs -ls /input-rw-r--r--   3  LZ  supergroup	 1472	 2023-05-07 17:05 	/input/weblogdata.txt

可以看到数据已经成功加载到HDFS中。

数据清洗

在之前的操作中,我们将数据集文件导入到 HDFS 的过程中,没有进行任何处理。现在我们想对输入的文件进行一个初步的清洗,将时间戳中的时分秒删除,只保留年月日,然后再加载到HDFS中。

先删除上一节中导入的数据。

[user@hadoop102 ~]$ hdfs dfs -rm /input/weblogdata.txt

在 Spoon 主界面的操作菜单中,依次选择“文件”→“新建”→“转换”,创建一个新的转换并保存,可以保存名称为“deleteTime”。

​在左侧项目栏的“核心对象”中,选择“输入”→“文本文件输入”,拖曳该控件到右侧的设计区域。

在“文本文件输入”控件图标上双击鼠标,然后单击“增加”按钮,单击“文件或目录”右侧的“浏览”按钮,选择weblogdata.txt文件。

​单击 “内容”,将分隔符改成“,”,即改成英文逗号,并把“头部”复选框的勾号去掉,不要选中,否则第一行的信息可能会丢失。

单击“字段”选项卡,单击“获取字段”按钮,将所有字段的字段类型都设置为“String”,再单击“确定”按钮。

在 Spoon 主界面的左侧项目栏的“核心对象”中,选择“转换”→“剪切字符串”,拖曳该控件到右侧的设计区域,并与“文本文件输入”控件进行连接。

双击鼠标打开“剪切字符串”控件属性设置对话框,将“输入流字段”设置为“Field1”, “输出流字段”不用改变,“起始位置”设置为 0,“结束位置”设置为10,单击“确定”按钮。

​在 Spoon 主界面的左侧项目栏的“核心对象”中,选择“Big Data”→“Hadoop File Output”, 拖拽该控件到右侧的设计区域,并与“剪切字符串”控件进行连接,连接时会出现两个选项,即“主输入步骤”和“错误处理步骤”,这里需要选择“主输入步骤”。

双击鼠标打开“Hadoop File Output”控件属性设置对话框,将“Hadoop cluster”设置为“Hadoop”,也就是直接使用已经配置好的 Hadoop 集群名称。在“文件”选项卡中,单击“Folder/File”右侧的“浏览(B)…”按钮,找到 HDFS 中的目录“input”(这个目录在之前的步骤中已经创建),单击“OK”按钮。在 input 后输入/logs。

在“内容”选项卡中,将“分隔符”里的符号改为英文逗号“,”,然后将“头部”复选框的勾号去掉,不要选中。

在“字段”选项卡中,依次单击下面的“获取字段”按钮和“最小宽度”按钮,然后单击“确定”按钮。

执行转换单击 Spoon 主界面的顶部菜单的运行按钮,进入执行转换界面,单击“启动”按钮开始执行转换。如果转换过程成功执行,所有控件右上角都会显示“勾号”。

在这里插入图片描述

转换完毕后,就可以在 Linux 终端中使用 HDFS Shell 命令查看刚才传输到 HDFS 中的各个文件。可以使用如下命令查看数据。

[user@hadoop102 opt]$ hdfs dfs -cat /input/logs.txt

结果如图所示。可以看出原来时间戳里面时分秒信息,已经被成功删除。

在这里插入图片描述

数据处理

在之前的示例中,我们已经演示完毕如何用 Kettle 将本地文件初步清洗后导入到 HDFS中,接下来我们尝试使用 Kettl 执行 Hive 的 HiveQL 语句,尝试统计每个页面的访问量,按由高到底排序。

在Hive中建表语句如下所示。表中数据如图所示。

CREATE EXTERNAL TABLE weblogs (
datetime STRING,
url STRING,
ip STRING,
user_agent STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input';

在这里插入图片描述

新建一个 Kettle 作业,只有“START”和“SQL”两个作业项,可以保存名称为“visits”。参考之前的步骤,拖拽“START”和“SQL”(在“脚本”下面)这两个控件,并进行连接。

在“SQL”控件图标上双击鼠标,打开属性设置对话框,在 SQL 脚本文本框中输入 SQL语句如下所示。

CREATE TABLE weblogs_visits as
SELECT url, COUNT(*) AS visit_count
FROM weblogs
GROUP BY url
ORDER BY visit_count DESC;

在确认已经启动 HiveServer2 服务后,单击“启动”按钮开始执行作业。执行完毕后,查询 weblogs_visits 表内容。

在这里插入图片描述

从图中可以看到url已经按照访问量倒序排列,page1是被访问次数最多的页面。

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

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

相关文章

RocketMQ-RocketMQ集群实践

搭建RocketMQ可视化管理服务 下载可视化客户端源码下载 | RocketMQ 这里只提供了源码,并没有提供直接运行的jar包。将源码下载下来后,需要解压并进入对应的目录,使用maven进行编译。(需要提前安装maven客户端) mvn clean package -Dmaven.t…

RPC和REST对比

RPC和REST对比 参考学习 RPC 和 REST 之间有什么区别? 当我们对比RPC和REST时,其实是在对比RPC风格的API和REST风格的API,后者通常成为RESTful API。 远程过程调用(RPC)和 REST 是 API 设计中的两种架构风格。API …

「Swift」取消UITableView起始位置在状态栏下方开始

前言:在写页面UI时发现,当隐藏了NavigationBar时,即使UITableView是从(0,0)进行布局,也会一直在手机状态栏下方进行展示布局,而我的想法是希望UITableView可以从状态栏处就进行展示布局 当前页面展示: 问题…

qt-C++笔记之QStringList

qt-C笔记之QStringList —— 杭州 2023-12-03 code review! 文章目录 qt-C笔记之QStringList1.1.《Qt官方文档》第一部分翻译&#xff1a;继承自QList\<QString\>-初始化-添加字符串1.2.迭代字符串1.3.join()和split()1.4.filter()1.5.lastIndexOf()1.6.indexOf()1.7.…

【Delphi】实现彩色日志显示框(TRichEdit Helper)

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

简单3D姿态基线模型网络架构与验证【SIM】

在这篇文章中&#xff0c;我们将回顾 ICCV’17 上提出的 Simple 3D Pose Baseline &#xff0c;即用于 3d 人体姿势估计的简单而有效的基线&#xff0c;也称为 SIM。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在…

基础组件总结(以Element UI组件库为例)

一般对一个组件的使用方式&#xff1a; 每一个组件都有被绑定的数据&#xff0c; &#xff08;1&#xff09;首先会对组件的数据初始化&#xff08;a.data中赋初值 b. 在生命周期函数created或mounted中为变量赋予初值&#xff09; &#xff08;2&#xff09;由于不同组件的…

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>#define BOARD_SIZE 10#define NUM_MINES 10int main() { int board[BOARD_SIZE][BOARD_SIZE]; int num_flags, num_clicks; int …

threadlocal - 黑马程序员

目录 1、ThreadLocal介绍1.2 ThreadLocal基本使用1.2.1、常用方法1.2.2 使用案例 1.3 ThreadLocal类与synchronized关键字 2、运用场景_事务案例3、ThreadLocal的内部结构4、 ThreadLocal的核心方法源码5、ThreadLocalMap源码分析5.2 弱引用和内存泄漏 课程地址&#xff1a; ht…

Blender学习笔记:小车狂奔动画

文章目录 路旁小树汽车尾气移动 教程地址&#xff1a;八个案例教程带你从0到1入门blender【已完结】 小车建模 路旁小树 1 添加摄像机&#xff0c;在小车下面拉一个平面&#xff0c;覆盖到摄像机的观察视窗。复制一层平面&#xff0c;收窄变成小车两侧的路面&#xff0c;编辑…

【设计模式-4.3】行为型——责任链模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;责任链模式&#xff1b; 审批流程 责任链模式属于行为型设计模式&#xff0c;关注于对象的行为。责任链模式非常典型的案例&#xff0c;就是审批流程的实现。如一个报销单的审批流程&#xff0c;根据报销单…

力扣每日一题day26[42. 接雨水]

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

一站式自动化:Ansible Playbook的全面学习之旅

1 Playbook介绍 1.1 Playbook介绍 playbook 是由一个或多个play组成的列表 Playbook 文件使用YAML来写的 1.2 YAML 1.2.1 介绍 是一种表达资料序列的格式&#xff0c;类似XML Yet Another Markup Language 2001年首次发表 www.yaml.org 1.2.2 特点 可读性好 和脚本语言交…

RPG项目01_新输入输出

基于“RPG项目01_脚本代码”&#xff0c;本次修改unity的新输入输出系统。本次修改unity需要重启&#xff0c;如果一直跟着做教学项目&#xff0c;请先保存项目&#xff0c;再继续修改unity为新输入输出系统。 向下翻&#xff0c; 向下翻&#xff0c; 选择both加入新输入输出系…

Android把宽高均小于给定值的Bitmap放大到给定值,Kotlin

Android把宽高均小于给定值的Bitmap放大到给定值&#xff0c;Kotlin 假设拉伸放大到SIZE2048 fun scaleSize(image: Bitmap): Bitmap {val w image.widthval h image.heightvar newW: Intvar newH: Intif (w > h) {newW SIZEnewH (SIZE / w.toFloat()) * h} else {newW …

qt 动态生成柱状图

cpp文件 #include "mform.h" #include "ui_mform.h" #include <QBarSeries> #include <QBarSet> #include <QtCharts> #include <QPushButton> #include <QtCharts/QChartView> #include <QtCharts/QPieSeries> #inc…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…

51单片机应用从零开始(九)·数组

目录 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 2. 用 P0 口显示字符串常量 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 C语言中的字符型数组是一种数据类型&#xff0c;它是一个由字符组成的序列&#xff0c;以空字符\0结尾。在声明字符型数组时&#xff0c;需要指…

Git【成神路】

目录 1.为啥要学git啊&#xff1f;&#x1f615;&#x1f615;&#x1f615; 2.版本控制软件的基本功能 &#x1f91e;&#x1f91e;&#x1f91e; 3.集中式版本控制 &#x1f936;&#x1f936;&#x1f936; 4.分布式版本控制&#x1f60e;&#x1f60e;&#x1f60e; …

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 只要描述你想要的UI是什么样的&#xff0c;它就能帮你生成&#xff0c;是不是很神奇&#xff1f; v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…