首页 > 其他分享 >Hive实战之航空数据分析

Hive实战之航空数据分析

时间:2022-10-26 12:01:10浏览次数:45  
标签:数据分析 实战 int Hive delay 语句 flights time TABLE

接着上Hive 大数据开发(一套打通)继续写

PS:最好是手敲代码一遍,有些代码可能是中文输入法打出来的,因为SQL代码块显示不出来Hive语法,导致看不出来到底是什么地方出现错误。所以盲目的直接复制粘贴会出现报错信息

9.1需求描述

利用Hive实现航空数据分析的全流程数据管理。

9.2、业务实现

9.2.1、创建数据表

创建数据表的语句功能强大,形式多样,基本语法和常用选项如下:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<数据库名>.]<表名>
  [(<列名1> <数据类型1>, <列名2> <数据类型2>, ...)]
  [PARTITIONED BY (<分区列名1> <数据类型1>, <分区列名2> <数据类型2>, ...)]
  [ROW FORMAT <行格式>] 
  [STORED AS <文件存储格式>]
  [LOCATION <HDFS存储路径>]
  [AS <查询语句>];

使用 CREATE TABLE [IF NOT EXISTS] <表名> 语句创建数据表 flights 用于存储航班数据集,其中

  • IF NOT EXISTS 关键词表示仅在该数据表不存在时才创建;
  • 列carrier、tailnum、origin和dest为字符串类型(string),其他列都是整数类型(int),数据类型会在后续章节详细介绍。
USE default; -- 切换数据库

CREATE TABLE IF NOT EXISTS fligths(
year int,
month int,
day int,
dep_time int,
dep_delay int,
arr_time int,
arr_delay int,
cancelled int,
carrier string,
tailnum string,
flight int,
origin sting,
dest string,
air_time int,
distance int,
hour int,
min int
);

9.2.2、描述数据表

使用 DESCRIBE [FORMATTED] <表名> 语句描述数据表flights 。

DESCIBE FORMATTED flight;

9.2.3、列出数据表

使用 SHOW TABLES [LIKE '<正则表达式>'] 语句列出所有(满足正则表达式的)数据表。正则表达式中,星号 * 指代一个或多个字母,竖线 | 表示或。

SHOW TABLES;

9.2.4、删除数据表

使用 DROP TABLE [IF EXISTS] <表名> 语句删除表 flights ,其中

  • IF EXISTS 关键词表示仅在该表存在时才删除。

删除表时会同时删除表的元数据和数据。事实上,数据会移动到HDFS上的 .Trash/Current 文件夹中(思考一下内外表)。

DROP TABLE IF NOT EXISTS flights;

9.2.5、从查询结果创建数据表

使用 CREATE TABLE [IF NOT EXISTS] <表名> AS <查询语句> 语句从查询结果创建数据表 flights_top5 ,查询结果为简单选取 flights 表中的所有数据。

CREATE TABLE IF NOT EXISITS flights_top2 AS
  SELECT * FROM flights  LIMIT 5;

9.2.6、拷贝表结构

使用 CREATE TABLE [IF NOT EXISTS] <新表名> LIKE <原表名> 语句拷贝 flights 表结构创建数据表 flightscp,并不拷贝数据。

CREATE TABLE IF NOT EXISTS flight_cp LIKE flights;

9.2.7、从本地文件系统导入数据表

使用 CREATE TABLE 语句创建数据表 flights 用于存储航班数据集。

DROP TABLE IF EXISTS flights;

CREATE TABLE IF NOT EXISTS flights(
year int,
month int, 
day int, 
dep_time int ,
dep_delay int, 
arr_time int, 
arr_delay int, 
cancelled int, 
carrier string, 
tailnum string,
flight int, 
origin string, 
dest string,
air_time int, 
distance int, 
hour int, 
min int
)
ROW FORMAT DELIMITED FIELDS TERMINNATED BY ','
SORED AS TEXTFILE;

使用 LOAD DATA LOCAL INPATH '<数据文件路径>' INTO TABLE <表名> 语句将本地文件系统中的数据文件 /opt/data/flights/flights14.csv 导入表 flights ,其中

  • LOCAL 关键词表示从本地文件系统导入。
    LOAD DATA LOCAL INPATH '/绝对路径/flights14.csv/'
    INTO TABLE flights;
    Loading data to table default.flights
    TABLE defult.flights stats:[numFiles=1,totalSize=16150465]
    -- 跑完上面的代码后
    
    SELECT * FROM flights LIMIT 5;

     

9.2.8、从HDFS导入数据表

重新创建数据表flights。

DROP TABLE IF EXISTS flights;

CREATE TABLE IF NOT EXISTS flights(
year int,
month int, 
day int, 
dep_time int ,
dep_delay int, 
arr_time int, 
arr_delay int, 
cancelled int, 
carrier string, 
tailnum string,
flight int, 
origin string, 
dest string,
air_time int, 
distance int, 
hour int, 
min int
)
ROW FORMAT DELIMITED FIELDS TERMINNATED BY ','
SORED AS TEXTFILE;

 

新启动一个终端,使用hdfs dfs -put命令将数据文件flights14上传到HDFS。

hdfs dfs -put /opt/data/flights/flights14.csv

使用 LOAD DATA INPATH '<数据文件路径>' INTO TABLE <表名> 语句将HDFS中的数据文件 /user/root/flights14.csv 导入表 flights 。

LOAD DATA INPATH '/绝对路径/flights14.csv' INTO TABLE flights;

Loading data to table default.flights
Table default.flights stats: [numFiles=1, totalSize=16150465]

-- 该语句仅仅是将数据文件在HDFS上从原路径移动到Hive表对应的路径下。


SELECT * FROM flights limit 5;

9.2.9、导入并覆盖

由于表 flights 中已经有数据,如果不使用OVERWRITE关键词则会在原有数据基础上添加新导入数据。

LOAD DATA LOCAL INPATH '/绝对路径/flights14.csv' INTO TABLE flights;
Loading data to data default.flights
Table default.flights stats:[numFiles=2,totalSize=32300]

使用 dfs -ls 命令显示表 flights 对应文件夹的统计信息。

dfs -ls /user/hive/warehouse/flights;

-- 运行代码
Found 2 items
-rwxr-xr-x   1 root supergroup   16150465 2020-08-04 06:37 /user/hive/warehouse/flights/flights14.csv
-rwxr-xr-x   1 root supergroup   16150465 2020-08-04 06:40 /user/hive/warehouse/flights/flights14_copy_1.csv

可以看出,该表对应的数据文件有2个,且文件大小完全一样。

使用 OVERWRITE 关键词导入并覆盖,将仅保留新导入数据。

LOAD DATA LOCAL INPATH '/opt/data/flights/flights14.csv' OVERWRITE INTO TABLE flights;

Loading data to table default.flights
Table default.flights stats: [numFiles=1, numRows=0, totalSize=16150465, rawDataSize=0]

使用 dfs -ls 命令显示表flights对应文件夹的统计信息。

dfs -ls /user/hive/warehouse/flights; 

-- 运行代码
Found 1 items
-rwxr-xr-x   1 root supergroup   16150465 2020-08-04 06:42 /user/hive/warehouse/flights/flights14.csv 

可以看出,该表对应的数据文件仅有1个。

.2.10、导入分区表

使用 CREATE TABLE ... PARTITIONED BY ... 语句创建分区表 flights ,其中分区列为 load_date 。

DROP TABLE IF EXISTS flights;

CREATE TABLE IF NOT EXISTS flights(
year int,
month int, 
day int, 
dep_time int ,
dep_delay int, 
arr_time int, 
arr_delay int, 
cancelled int, 
carrier string, 
tailnum string,
flight int, 
origin string, 
dest string,
air_time int, 
distance int, 
hour int, 
min int
)
ROW FORMAT DELIMITED FIELDS TERMINNATED BY ','
SORED AS TEXTFILE;

数据导入时,使用 PARTITION 关键词指定导入的分区。

LOAD DATA LOCAL INPATH '/opt/data/flights/flights14.csv' INTO TABLE flights PARTITION (load_date='2018-10-12');

数据插入语句的基本语法和常用选项如下:

INSERT INTO|OVERWRITE TABLE <表名>

[PARTITION (<分区列名1>=<分区列值1>, <分区列名2>=<分区列值2>, ...)] <查询语句>;

9.2.11、基本插入

使用 CREATE TABLE 语句创建数据表 flights 用于存储航班数据集。

DROP TABLE IF EXISTS flights;

CREATE TABLE IF NOT EXISTS flights(
year int,
month int, 
day int, 
dep_time int ,
dep_delay int, 
arr_time int, 
arr_delay int, 
cancelled int, 
carrier string, 
tailnum string,
flight int, 
origin string, 
dest string,
air_time int, 
distance int, 
hour int, 
min int
)

使用 INSERT INTO TABLE <表名> <查询语句> 语句将查询结果插入表 flights ,查询结果为简单选取 flights 表中的所有数据。

INSERT INTO TABLE flights
SELECT * FROM flights;

9.2.12、插入分区表

使用 CREATE TABLE ... PARTITIONED BY ... 语句创建分区表 flights ,其中分区列为 year 和 month 。

DROP TABLE IF EXISTS flights;

CREATE TABLE IF NOT EXISTS flights(
year int,
month int, 
day int, 
dep_time int ,
dep_delay int, 
arr_time int, 
arr_delay int, 
cancelled int, 
carrier string, 
tailnum string,
flight int, 
origin string, 
dest string,
air_time int, 
distance int, 
hour int, 
min int
)
PARTITIONED BY (year int,month int);

数据插入时,使用 PARTITION 关键词指定导入的分区。

INSERT OVERWRITE TABLE flights PARTITION(year =2014,month=1)
SELECT day,
dept_time,
dept_delay,
arr_time,
arr_delay,
cancelled,
carrier, 
tailnum,
flight, 
origin, 
dest, 
air_time, 
distance, 
hour, 
min   FROM flights
WHRER year = 2014 AND month=1;

INSERT OVERWRITE TABLE flights PARTITION (year=2014, month=2)
SELECT day, dep_time, dep_delay, arr_time, arr_delay, cancelled, carrier, 
tailnum, flight, origin, dest, air_time, distance, hour, min 
FROM flights
WHERE year=2014 and month=2;

使用 SHOW PARTITIONS 语句显示分区表 flights 的分区

SHOW PARTITIONS flights;

9.2.13、动态插入分区表

以上的例子插入分区表时,插入每个分区都需要指定分区列的值,如果分区较多则会非常繁琐。动态分区只需要使用一条语句,自动根据分区列的值,插入相应的分区。

在动态插入分区表前,需要先设置2个选项:

  • 选项 hive.exec.dynamic.partition.mode 表示动态分区模式, strict 模式中用户必须至少指定一个分区以防止用户意外的覆盖所有分区, nonstrict 模式中用户可以不指定任何一个分区,即所有分区都是动态的,默认为 strict ;
  • 选项 hive.exec.dynamic.partition 表示是否允许动态分区, true 表示允许, false 表示不允许,默认为 true 。
  • SET hive.exec.dynamic.partition.mode = nonstrict;
  • SET hive.exec.dynamic.partition = true;

使用 INSERT ... PARTITION ... 语句插入分区表。

INSERT INTO TABLE flights PARTITION(year, month)
SELECT day, dep_time, dep_delay, arr_time, arr_delay, cancelled, carrier, 
tailnum, flight, origin, dest, air_time, distance, hour, min,
year, month
FROM flights;

使用 SHOW PARTITIONS 语句显示分区表 flights 的分区。

SHOW PARTITIONS flights;

9.2.14、数据查询分析

1、数据查询语句的基本语法和常用选项如下:

ELECT [DISTINCT] <列名表达式1> [AS <列别名1>], <列名表达式2> [AS <列别名2>], ...
FROM <表名>
[WHERE <筛选条件>]
[GROUP BY <列名表达式列表>]
[HAVING <筛选条件>]
[ORDER BY <列名表达式列表>]
[LIMIT <行数>]

2、使用 SELECT ... FROM ... LIMIT ... 语句从航班表 flights 中选取所有列,并返回前5行,其中

  • 星号*表示选取所有列;
  • LIMIT语句表示保留前几行。
SELECT * FROM flights LIMIT 5;

3、使用 WHERE语句 筛选航班表 flights 中出发地(列 origin )为 'JFK' 、月份(列 month )为6月的数据行,其中

  • 字符串可以可以使用单引号 ' 或双引号 " ;
  • 一个等号 = 表示比较是否相等;
  • 运算符 and 表示多个条件“与”的关系。
SELECT * 
FROM flights
WHERE origin = 'JFK' and month = 6
LIMIT 5;

4、使用 ORDER BY 语句将返回结果按出发地(列 origin )顺序、目的地(列 dest )倒序排列,其中

  • DESC 关键词表示倒序排列, ASC 关键词表示顺序排列,默认为顺序排列,因此 ASC 可以省略。
SELECT * 
FROM flights
ORDER BY origin, dest DESC
LIMIT 5;

5、使用 SELECT 语句后跟列名,选取航班到达延误分钟数(列 arr_delay )和出发延误分钟数(列 dep_delay ),并使用 AS 关键词将这两列重命名为 delay_arr 和 delay_dep 。

SELECT arr_delay AS delay_arr, dep_delay AS delay_dep
FROM flights
LIMIT 5;

6、使用 SELECT 语句后跟列名的表达式,新计算返回2列:平均速度(列 speed )和总延误分钟数(列 delay )。

SELECT distance / (air_time / 60) AS speed,
arr_delay + dep_delay AS delay
FROM flights
LIMIT 5;

7、所谓数据聚合,就是将原数据中的多行按一定的计算方法合并成一行返回,其中有两个要素:

  • 计算方法:在Hive中通过聚合函数指定;
  • 分组方式:即哪些原数据中的行合并成返回结果的一行,在Hive中通过 SELECT 语句中未包含在聚合函数中的列以及 GROUP BY 语句中的列指定。
  • 调用聚合函数 count() 计算表 flights 的行数.

  • SELECT count(1)
    FROM flights;

8、使用 GROUP BY 语句指定按出发地(列 origin )分组,计算各出发地的行数

SELECT origin ,count(1)
FROM flights
GROUP BY origin;

9、使用 GROUP BY 语句指定多个列,计算各不同出发地(列 origin )和目的地(列 dest )的组合中,航空公司代码(列 carrier )为 'AA' 的行数。

SELECT origin,dest,count(1)
FROM flights
WHERE carrier='AA'
GROUP BY origin,dest;

标签:数据分析,实战,int,Hive,delay,语句,flights,time,TABLE
From: https://www.cnblogs.com/catch-autumn/p/16827808.html

相关文章

  • 最新抖音数据分析app爬虫
    我们提供封装好的抖音数据采集接口,实时采集,接口稳定。长期维护使用便宜接口使用详情请参考接口地址:github访问地址:https://github.com/ping0206guo/pingguoapi全部支......
  • GPU高性能编程CUDA实战 电子书 pdf
    作者:JasonSanders/EdwardKandrot出版社:机械工业出版社原作名:CUDAbyExample:anIntroductiontoGeneral-PurposeGPUProgramming 链接:GPU高性能编程CUDA......
  • hive课堂测试2
    2、数据分析:在HIVE统计下列数据。(1)统计最受欢迎的视频/文章的Top10访问次数(video/article)(2)按照地市统计最受欢迎的Top10课程(ip)(3)按照流量统计最受欢迎的Top10课程(traf......
  • 实战练习
    实战练习作业讲解1.1.编写一个统计指定文件类型的脚本工具输入指定类型的文件后缀eg:.txt并给出一个具体路径之后统计该类型文件在该文件下的个数ps:简单实现即可......
  • xss实战
    一、xss漏洞原理1.什么是xss漏洞?跨站点脚本(也称为XSS)是一种Web安全漏洞,允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略,该策略旨在将不同......
  • 搭建Hive
    一、配置环境前准备1、更改主机名vi/etc/hostname#将文件中内容删除,添加上本机主机名如果编辑文件时出现一下错误:执行命令ls-a/路径查询出隐藏文件找到与......
  • SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动
      近年来uni-app发展势头迅猛,只要会vue.js,就可以开发一套代码,发布移动应用到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、......
  • Go Web 实战:如何创建项目及增加日志功能
    从本文开始,我们来看一下如何从零搭建一个Go项目。回顾一下基础的Go项目运行过程首先,新建一个​​sports​​的文件,然后键入此文件目录下,选择在终端中打开,使用如下命令......
  • 【Python数据分析】数据的维度、Numpy
    数据的维度一维数据一维数据由对等关系的有序或无序数据构成,采用线性方式组织列表和数组二维数据是由多个一维数据组成,是一维数据的组合形式多维数据由一维或二维数......
  • mininet入门实战 学习指南
    mininet入门实战学习指南课程链接:https://www.51openlab.com/platform/curriculum/a18026230ad04063a70b6bb625212f3f/detail/实验一:mininet源码安装与验证指令说明ll......