关键词:
打怪升级之小白的大数据之旅(七十)
Hive旅程终点站:Hive的综合案例
本章内容
本章是Hive的最后一章,主要是通过一个案例来对我们前面所学的知识点进行一个实操总结,大家根据案例查漏补缺,哪里知识点不会就补一下哪里的知识点
数据结构
测试数据大家自行下载:https://download.csdn.net/download/Li_G_yuan/19362051?spm=1001.2014.3001.5503
上传数据到HDFS
# 创建本地存储数据文件夹
mkdir /opt/module/hive/video
# 通过xftp/rz等工具将数据放到该文件夹下,我就不演示了
# HDFS上创建存储视频表数据的文件夹
hadoop fs -mkdir -p /video/movie
# HDFS上创建存储用户表数据的文件夹
hadoop fs -mkdir -p /video/user
# 上传数据到指定文件夹
hadoop fs -put video/user/user.txt /video/user
hadoop fs -put video/movie/*.txt /video/movie
视频表
字段 | 备注 | 详细描述 |
---|---|---|
videoId | 视频唯一id(String) | 11位字符串 |
uploader | 视频上传者(String) | 上传视频的用户名String |
age | 视频年龄(int) | 视频在平台上的整数天 |
category | 视频类别(Array) | 上传视频指定的视频分类 |
length | 视频长度(Int) | 整形数字标识的视频长度 |
views | 观看次数(Int) | 视频被浏览的次数 |
rate | 视频评分(Double) | 满分5分 |
Ratings | 流量(Int) | 视频的流量,整型数字 |
conments | 评论数(Int) | 一个视频的整数评论数 |
relatedId | 相关视频id(Array) | 相关视频的id,最多20个 |
用户表
字段 | 备注 | 字段类型 |
---|---|---|
uploader | 上传者用户名 | string |
videos | 上传视频数 | int |
friends | 朋友数量 | int |
需求
统计油管视频网站的常规指标,各种TopN指标(数据是很多年前的了):
- 统计视频观看数Top10
- 统计视频类别热度Top10(类别热度:类别下的总视频数)
- 统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数
- 统计视频观看数Top50所关联视频的所属类别Rank
- 统计每个类别中的视频热度Top10,以Music为例(视频热度:视频观看数)
- 统计每个类别视频观看数Top10
- 统计上传视频最多的用户Top10以及他们上传的视频观看次数在前20的视频
创建表与加载数据
因为是模拟实际开发,所以我就通过创建外部表的方式来进行
创建表并加载数据
创建外部数据表:movie_ori,movie_user_ori,
-- movie_ori表
create external table movie_ori(
videoId string,
uploader string,
age int,
category array<string>,
length int,
views int,
rate float,
ratings int,
comments int,
relatedId array<string>)
row format delimited fields terminated by "\\t"
collection items terminated by "&"
stored as textfile
location '/video/movie';
-- movie_user_ori表
create external table movie_user_ori(
uploader string,
videos int,
friends int)
row format delimited
fields terminated by "\\t"
stored as textfile
location '/video/user';
创建最终表:movie_orc,movie_user_orc(使用orc存储)
-- movie_orc表
create table movie_orc(
videoId string,
uploader string,
age int,
category array<string>,
length int,
views int,
rate float,
ratings int,
comments int,
relatedId array<string>)
stored as orc
tblproperties("orc.compress"="SNAPPY");
-- movie_user_orc表
create table movie_user_orc(
uploader string,
videos int,
friends int)
row format delimited
fields terminated by "\\t"
stored as orc
tblproperties("orc.compress"="SNAPPY");
向表中插入数据
insert into table movie_orc select * from movie_ori;
insert into table movie_user_orc select * from movie_user_ori;
根据需求完成业务逻辑
前面的数据、表都准备好了,接下来就是根据需求完成我们的业务逻辑了
统计视频观看数Top10
思路:使用order by按照views字段做一个全局排序即可,同时我们设置只显示前10条
SELECT
videoId,
views
FROM
movie_orc
ORDER BY
views DESC
LIMIT 10;
统计视频类别热度Top10(类别热度:类别下的总视频数)
思路:
(1)即统计每个类别有多少个视频,显示出包含视频最多的前10个类别。
(2)我们需要按照类别group by聚合,然后count组内的videoId个数即可。
(3)因为当前表结构为:一个视频对应一个或多个类别。所以如果要group by类别,需要先将类别进行列转行(炸开),然后再进行count即可。
(4)最后按照热度排序,显示前10条
SELECT
category_name,
count(t1.videoid) hot
FROM
(
select
videoid,
category,
category_name
from movie_orc
lateral view explode(category) movie_orc_tmp as category_name
) t1
group by category_name
order by hot DESC
limit 10;
统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数
思路:
(1)求出观看数前20的视频信息(主要是类别)
(2)在第一步的结果下,求出观看数前20的视频的类别,需要炸开(列转行),形成新字段category_name
(3)在第二步的结果下,按照炸开的视频类别category_name分组,然后统计组内的个数category_count
SELECT
t2.category_name,
count(t2.videoid) category_count
from
(
select
videoid,
category_name
from
(
SELECT
videoid,
category,
views
from movie_orc
order by VIEWS DESC
limit 20
) t1
LATERAL VIEW explode(category) tmp as category_name
) t2
group by t2.category_name;
统计视频观看数Top50所关联视频的所属类别Rank
思路:
(1)先找到观看数前50的视频信息(主要是求出关联视频)
(2)炸开第一步求出的关联视频array,形成一个新字段new_relatedid
(3)用第二步求出的结果集的new_relatedid和movie_orc 表进行join,求出new_relatedid的类别
(4)炸开第三步结果中的category,形成新字段category_name
(5)在第四步的结果上,按照category_name 分组,然后求出每组的个数category_count
(6)在第五步的基础之上,对category_count进行排序,利用开窗函数
SELECT
t6.category_name,
t6.category_count,
rank()over(order by category_count desc) rk
FROM
(
SELECT
t5.category_name,
count(t5.new_relatedid) category_count
FROM
(
SELECT
t4.new_relatedid,
category_name
FROM
(
SELECT
t2.new_relatedid,
t3.category
FROM
(
SELECT
t1.videoid,
new_relatedid
FROM
(
SELECT
videoid,
views,
relatedid
FROM movie_orc
order by views DESC
limit 50
) t1
LATERAL view explode(t1.relatedid) tmp as new_relatedid
) t2
join
movie_orc t3
on t2.new_relatedid = t3.videoid
) t4
LATERAL view explode(t4.category) t4_tmp as category_name
) t5
group by t5.category_name
) t6;
统计每个类别中的视频热度Top10,以Music为例(视频热度:视频观看数)
思路:
(1)要想统计Music类别中的视频热度Top10,需要先找到Music类别,那么就需要将category炸开形成新的字段category_name
(2)然后通过category_name 过滤“Music”分类的所有视频信息,按照视频观看数倒序排序,取前10
SELECT
t1.videoid,
t1.category_name,
t1.VIEWS
FROM
(
SELECT
videoid,
category_name,
VIEWS
FROM movie_orc
lateral view explode(category) tmp as category_name
) t1
where t1.category_name = "Music"
order by t1.views DESC
limit 10;
统计每个类别视频观看数Top10
思路:
(1)把原始表中的类别炸开,形成新字段category_name
(2)按照炸开的类别字段category_name分区,按照视频观看数views倒序排序进行开窗,求出每个类别下的所有视频的观看次数排名rk
(3)按照rk字段对全表进行where过滤,求出每个类别观看数Top10
SELECT
t2.category_name,
t2.videoid,
t2.views,
t2.rk
FROM
(
SELECT
t1.category_name,
t1.videoid,
t1.views,
rank() over(partition by t1.category_name order by t1.views desc) rk
FROM
(
SELECT
videoid,
category_name,
VIEWS
FROM movie_orc
lateral view explode(category) tmp as category_name
) t1
) t2
where rk <= 10;
统计上传视频最多的用户Top10以及他们上传的视频观看次数在前20的视频
这个需求有两种思考方式,我都写下来
思路一:取Top10中所有人上传的视频的前20
(1)去用户表movie_user_orc求出上传视频最多的10个用户
(2)关联movie_orc 表,求出这10个用户上传的所有的视频,按照观看数取前20
SELECT
t1.uploader,
t2.videoid,
t2.views
FROM
(
select
uploader,
videos
from movie_user_orc
order by videos DESC
limit 10
) t1
JOIN
movie_orc t2
on t1.uploader = t2.uploader
ORDER BY t2.views DESC
LIMIT 20;
思路二:取Top10中每个人上传的视频的前20
(1)去用户表movie_user_orc求出上传视频最多的10个用户
(2)关联movie_orc表,求出这10个用户上传的所有的视频id,视频观看次数,还要按照uploader分区,views倒序排序,求出每个uploder的上传的视频的观看排名rk
(3)在第二步的结果上,按照rk进行where过滤,求出rk<=20的数据
SELECT
t3.uploader,
t3.videoid,
t3.views,
t3.rk
FROM
(
SELECT
t1.uploader,
t2.videoid,
t2.views,
rank() over(partition by t1.uploader order by t2.views desc) rk
FROM
(
select
uploader,
videos
from movie_user_orc
order by videos DESC
limit 10
) t1
JOIN
movie_orc t2
on t1.uploader = t2.uploader
) t3
where t3.rk <= 20;
总结
- Hive到此就全部结束了,大家没事的时候就去第一章中我那个Hve升级里面,多做一些题,熟能生巧,下面我来总结一下整个Hive内容
Hive总结
- hive是基于hadoop的一个工具,它的主要作用是通过Hive像操作Mysql一样操作Hadoop中存储的数据,Hive操作的语句我们通常称之为HQL
- hive可以实现类SQL主要是依据它的框架原理:元数据metastore用于建立文件、文件夹与表、数据的映射,内部的编译器和解析器可以将HQL语句转换为底层的MR程序
打怪升级之小白的大数据之旅(六十一)<hive旅程第二站:hive安装>(代码片段)
打怪升级之小白的大数据之旅(六十一)Hive旅程第二站:Hive安装上次回顾上一章我们学习了Hive的概念以及框架原理,本章节是对Hive的安装进行分享,因为它有些需要自己配置的点,所以我单独开了一个章节Hive安装前期... 查看详情
打怪升级之小白的大数据之旅(六十九)<hive旅程第十站:hive的优化>(代码片段)
打怪升级之小白的大数据之旅(六十九)Hive旅程第十站:Hive的优化上次回顾上一章介绍了Hive的压缩与存储格式,本章节是Hive的一起其他优化方法Fetch抓取Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算从hive... 查看详情
打怪升级之小白的大数据之旅(六十五)<hive旅程第六站:hive的查询>(代码片段)
打怪升级之小白的大数据之旅(六十五)Hive旅程第六站:Hive的查询上次回顾经过前面的学习,我们已经可以初步使用Hive对数据的一些简单操作了,本章节是Hive的一个重点内容–查询查询HQL和我们前面学习的Mysql语法是一样... 查看详情
打怪升级之小白的大数据之旅(六十八)<hive旅程第九站:hive的压缩与存储>(代码片段)
打怪升级之小白的大数据之旅(六十八)Hive旅程第九站:Hive的压缩与存储上次回顾上一章,我们学习完了hive的函数相关操作,到此,我们hive的大的知识点就全部介绍完毕了,当然了,还有一些细节我没有讲到... 查看详情
打怪升级之小白的大数据之旅(六十三)<hive旅程第四站:ddl操作>(代码片段)
打怪升级之小白的大数据之旅(六十三)Hive旅程第四站:DDL操作上次回顾上一章,我们学习了Hive的数据类型以及访问方式,本章节我们对数据库与数据表的操作进行学习DDL操作数据库操作的CURD数据库的操作和mysql相同,... 查看详情
打怪升级之小白的大数据之旅(六十四)<hive旅程第五站:dml基本操作>(代码片段)
打怪升级之小白的大数据之旅(六十四)Hive旅程第五站:DML基本操作上次回顾上一章,我们学习了Hive的DDL操作,学会如何操作数据库、数据表后,本章我们就要开始学习如何将数据导入到表中,如何将数据从表中导... 查看详情
打怪升级之小白的大数据之旅(六十六)<hive旅程第七站:hive的分区表与分桶表>(代码片段)
打怪升级之小白的大数据之旅(六十六)Hive旅程第七站:Hive的分区表与分桶表上次回顾上一章,我们学习了Hive的查询相关语法,本章节我们学习一下分区表与分桶表分区表通过前面Hive的学习,我们知道,表在HDFS中... 查看详情
打怪升级之小白的大数据之旅(七十二)<flume进阶>(代码片段)
打怪升级之小白的大数据之旅(七十二)Flume进阶上次回顾上一章对Flume的基础知识点进行了分享,有了上一章的铺垫,本章就深入学习一下Flume的进阶知识点Flume的使用很简单,主要就是写配置文件,至于具体怎么配... 查看详情
打怪升级之小白的大数据之旅(七十三)<flume高级>(代码片段)
打怪升级之小白的大数据之旅(七十三)Flume高级上次回顾上一章介绍了Flume的内部原理,本章就Flume的扩展知识进行讲解,本章的重点就是了解并学会使用Flume的自定义组件自定义组件在上一章介绍了内部原理,所以下... 查看详情
打怪升级之小白的大数据之旅(七十四)<初识kafka>(代码片段)
打怪升级之小白的大数据之旅(七十四)初识Kafka引言学完Flume之后,接下来将为大家带来Kafka相关的知识点,在工作中,Kafka和Flume经常会搭配使用,那么Kafka究竟是什么呢?让我们开始今天的内容吧Kafka地图惯例&... 查看详情
打怪升级之小白的大数据之旅(六十)<hive旅程中的始发站>(代码片段)
打怪升级之小白的大数据之旅(六十)Hive旅程中的始发站引言经过了前面Hadoop、MR、Java、MySQL以及Linux的洗礼,接下来我们就要进入到大数据中特别重要的一个知识点学习–Hive,Hive是我们大数据日常工作中必不可少的一个技能... 查看详情
打怪升级之小白的大数据之旅(七十一)<hadoop生态:初识flume>(代码片段)
打怪升级之小白的大数据之旅(七十一)Hadoop生态:初识Flume上次回顾上一章,我们学习完了hive的内容,本章开始是Hadoop中经常使用的另外一个框架Flume初识Flume下面这个是flume的标志flume的中文是水槽,但我觉得将它... 查看详情
打怪升级之小白的大数据之旅(七十二)<flume进阶>(代码片段)
打怪升级之小白的大数据之旅(七十二)Flume进阶上次回顾上一章对Flume的基础知识点进行了分享,有了上一章的铺垫,本章就深入学习一下Flume的进阶知识点Flume的使用很简单,主要就是写配置文件,至于具体怎么配... 查看详情
打怪升级之小白的大数据之旅(七十三)<flume高级>(代码片段)
打怪升级之小白的大数据之旅(七十三)Flume高级上次回顾上一章介绍了Flume的内部原理,本章就Flume的扩展知识进行讲解,本章的重点就是了解并学会使用Flume的自定义组件自定义组件在上一章介绍了内部原理,所以下... 查看详情
打怪升级之小白的大数据之旅(七十四)<初识kafka>(代码片段)
打怪升级之小白的大数据之旅(七十四)初识Kafka引言学完Flume之后,接下来将为大家带来Kafka相关的知识点,在工作中,Kafka和Flume经常会搭配使用,那么Kafka究竟是什么呢?让我们开始今天的内容吧Kafka地图惯例&... 查看详情
flask连接数据库打怪升级之旅
...一个学习经验,也就是我们今天分享的连接数据库部分的打怪升级之旅。希望可以为大家在学习Python的路上提供一些参考。初级阶段首先安装Mysql扩展包650)this.width=650; 查看详情
flask连接数据库打怪升级之旅
...、初级阶段 1.Mysql扩展包 2.建立数据库连接3.开启打怪升级之路 在日常开发中,连 查看详情
03注解是什么?——《android打怪升级之旅》(代码片段)
感谢大家和我一起,在Android世界打怪升级!注解非常的简单,但又大量的出现在源码中。希望通过该文章,能让大家看到注解不打怵,明白如何自定义注解,以及注解的作用,一眼就能粗略的理解该注... 查看详情