大数据开发——Hive实战案例

news2025/8/3 23:46:15

文章目录

  • 1. 创建表结构
    • 1.1 视频表结构
    • 1.2 用户表结构
  • 2. 准备工作
    • 2.1 创建临时表
    • 2.2 创建最终使用表
    • 2.3 对创建表进行解读
  • 3. 业务分析

1. 创建表结构

1.1 视频表结构

在这里插入图片描述

1.2 用户表结构

在这里插入图片描述

2. 准备工作

2.1 创建临时表

  • 由于使用的是orc方式进行存储,所以我们需要建立一个临时表,通过查询插入的方式将数据插入到最终表中。

创建临时视频表

create table gulivideo_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;

创建临时用户表

create table gulivideo_user_ori(
 uploader string,
 videos int,
 friends int)
row format delimited 
fields terminated by "\t" 
stored as textfile;

加载原数据到临时表

load data local inpath "/opt/module/data/video" into table gulivideo_ori;
load data local inpath "/opt/module/user" into table gulivideo_user_ori;

2.2 创建最终使用表

创建视频表

create table gulivideo_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");

创建用户表

create table gulivideo_user_orc(
 uploader string,
 videos int,
 friends int)
row format delimited 
fields terminated by "\t" 
stored as orc
tblproperties("orc.compress"="SNAPPY");

2.3 对创建表进行解读

由于初始表和最终表他们两者中的结构都是一样的,所以对其中一种进行解读

  • 对于用户表

    • 三个字段都是基本数据类型,行格式字段分割以‘\t’结束,以orc的方式存储,并且设置压缩属性为snappy
  • 视频表

    • 视频表中视频的类别和视频的相关视频两个字段是数组的方式进行存储的 ,字段之间分隔符为‘\t’,数组中元素的分隔符为‘&’

3. 业务分析

需求Ⅰ:统计视频观看数 Top10

  • 分析
    • 第一步: 本需求比较简单,直接对视频的观看数进行排序,使用LIMIT关键字,限定前十条数据

代码:

select videoId
from gulivideo_orc
order by views
limit 10;

在这里插入图片描述


需求Ⅱ:统计视频类别热度 Top10

  • 分析
    • 第一步:获取视频类别,使用炸裂函数explode,由于不需要表中的其他字段,所以可以不考虑使用侧偏移
    • 第二部:按照视频的类型进行分组,并计算每一个类别的视频总数,按照总数获取前十的视频类别

步骤代码:

--步骤一使用下列任意一种都可以,第一种使用侧偏移,第二种直接炸裂
select 
videoId,
category_name
from gulivideo_orc
lateral view explode(category) tmp_category as category_name;t1

select
explode(category) categoru_name
from gulivideo_orc;t1

--第二步代码:
select
category_name,
count(*) ct
from t1
group by category_name
order by ct desc
limit 10;

最终代码:

select
category_name,
count(*) ct
from
(select
explode(category) category_name
from gulivideo_orc)t1
group by category_name
order by ct desc
limit 10;

在这里插入图片描述


需求Ⅲ:统计出视频观看数最高的 20 个视频的所属类别以及每一个类别包含 Top20 视频的个数

  • 分析
    • 第一步:统计观看数最高的二十个视频
    • 第二步:获取视频的类别
    • 第三步:按照类别进行分组,获取每一组的视频数(即为每一个类别中包含Top20视频的个数)
select 
category
from gulivideo_orc
order by views desc
limit 20;t1

select
explode(category) category_name
from t1;t2

select
category_name,
count(*) video_sum
from  t2
group by category_name;

最终代码:

select
category_name,
count(*) video_sum
from 
(select
explode(category) category_name
from 
(select 
category
from gulivideo_orc
order by views desc
limit 20)t1)t2
group by category_name;

在这里插入图片描述


需求Ⅳ: 统计视频观看数 Top50 所关联视频的所属类别排序

  • 分析
    • 第一步:获取观看数Top50的视频
    • 第二步:获取视频的关联的视频Id
    • 第三步:和原表做内连接,查询到该id的类别
    • 第四步:将类别进行炸裂
    • 第五步:按照类别进行分组,并且统计该分组下的视频总数,按照总数进行排序

分步代码:

select
relatedId
from gulivideo_orc
order by views desc
limit 50;t1

select
explode(relatedId) relatedId_id
from t1;t2

select
category
from t2
join gulivideo_orc t3
on t2.relatedId_id = t3.videoId;t4

select
explode(category) category_name
from t4;t5

select
category_name,
count(*) ct
from t5
group by category_name
order by ct desc;

代码:

select
category_name,
count(*) ct
from 
(select
explode(category) category_name
from 
(select
category
from 
(select
explode(relatedId) relatedId_id
from 
(select
relatedId
from gulivideo_orc
order by views desc
limit 50)t1)t2
join gulivideo_orc t3
on t2.relatedId_id = t3.videoId)t4)t5
group by category_name
order by ct desc;

在这里插入图片描述


需求Ⅴ:统计每个类别中的视频热度 Top10,以 Music 为例

  • 分析
    • 第一步:将视频的类别炸裂开
    • 第二步:获取类别是Music的数据,并且按照观看数进行排序

分布代码:

select
videoId,
category_name
from gulivideo_orc
lateral view explode(category) tmp_category as category_name;t1

select
videoId,
views,
category_name
from t1
where category_name = "Music"
order by views desc
limit 10;

代码:

select
videoId,
views,
category_name
from 
(select
videoId,
views,
category_name
from gulivideo_orc
lateral view explode(category) tmp_category as category_name)t1
where category_name = "Music"
order by views desc
limit 10;

在这里插入图片描述


需求Ⅵ:统计每个类别视频观看数 Top10

  • 分析
    • 由于要求组内进行排序,所以使用开窗函数over()
    • 第一步:使用explode()函数,将类别分开
    • 第二步:使用开窗函数,按照类别分区,并且使用观看数进行排序
    • 第三步:获取前十数据

分步代码:

select 
videoId,
views,
category_name
from gulivideo_orc
lateral view explode(category) tmp_category as category_name;t1

select
videoId,
views,
category_name
rank() over(partition by t1.category_name order by t1.views desc) rk
from t1;t2

select
videoId,
views,
category_name,
rk
from t2
where t2.rk <= 10; 

代码:

select
videoId,
views,
category_name
rk
from (
select
videoId,
views,
category_name,
rank() over(partition by t1.category_name order by t1.views desc) rk
from 
(select 
videoId,
views,
category_name
from gulivideo_orc
lateral view explode(category) tmp_category as category_name)t1)t2
where t2.rk <= 10; 

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


需求Ⅶ:统计上传视频最多的用户 Top10 以及他们上传的视频观看次数在前 20 的视频

  • 分析
    • 第一步:统计上传视频最多的用户 Top10
    • 第二步:用户表和视频表做内连接,获取Top10用户上传的所有视频Id
    • 第三步:按照用户进行分区,并且获取每一个用户排名前20的视频(按照视频观看书排序)

分布代码:

select
uploader
from
gulivideo_user_orc
order by videos desc
limit 10;t1

select
videoId,
views,
t2.uploader 
from t1 
join gulivideo_orc g
on t1.uploader = g.uploader;t2

select
videoId,
views,
uploader,
rank()over(partition by uploader order by views desc) rk
from t2;t3

select
videoId,
views,
uploader
from t3
where rk<= 20;

代码:

select
videoId,
views,
uploader,
rank()over(partition by uploader order by views desc) rk
from 
(select
videoId,
views,
t1.uploader 
from 
(select
uploader
from
gulivideo_user_orc
order by videos desc
limit 10)t1 
join gulivideo_orc g
on t1.uploader = g.uploader) t2;
  • 由于数据不全,所有没有查询到数据
    在这里插入图片描述

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

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

相关文章

OpenFlow协议原理及基本配置-网络测试仪实操

一、OpenFlow协议原理 1.OpenFlow技术背景 ●转发和控制分离是SDN网络的本质特点之一。在SDN网络架构中&#xff0c;控制平面与转发平面分离&#xff0c;网络的管理和状态在逻辑上集中到一起&#xff0c;底层的网络基础从应用中独立出来&#xff0c;由此&#xff0c;网络获得…

不知道照片上怎么文字翻译成英文?来看看这篇文章

不知道你们在遇到看不懂的英文图片时&#xff0c;是不是和以前的我一样&#xff0c;一个一个的把图片内容输到翻译软件里&#xff0c;然后再进行翻译&#xff0c;其实这种办法不仅费时还费力&#xff0c;而且一旦遇到其它的外文就彻底没辙了&#xff0c;那怎么办呢&#xff1f;…

[附源码]java毕业设计音乐交流平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

我做数画ai绘画教程日赚过千,良心分享给想兼职赚钱的人

ai绘画能实现日赚过千&#xff0c;你信吗&#xff1f; 现在什么是风口&#xff1f;当然是ai绘画。而AI绘画里&#xff0c;什么最受欢迎&#xff0c;不用说&#xff0c;自然是二次元。 然后&#xff0c;很多人一拥而上&#xff0c;都去拍自己的二次元照片&#xff0c;然后在各…

10000m3d城镇生活污水处理工艺设计

目 录 1前 言 1 1.1 设计任务 2 1.2 设计目的 2 1.3 设计要求 2 1.4设计的数据以及资料 2 1.5 处理程度的计算 3 2 总体设计 5 2.1工艺比较的选择 5 2.2设计流量 8 2.2.1 设计规模 8 2.2.2 设计最大流量 8 2.3 格栅的设计计算 8 2.3.1格栅的作用及种类 8 2.3.2格栅的设计原则 8…

Linux系统编程(一)——环境搭建

准备写系统的总结Linux系统的一些知识以及Linux系统编程。这一篇先讲Linux搭建常用的开发环境。 目录 0x01 Linux开发环境搭建 一、远程链接操作 0x02 GCC 一、安装 二、了解GCC 0x03 静态库的制作及使用 一、库的介绍 二、静态库 0x04 动态库的制作和使用 一、配置…

Python遥感开发之批量掩膜和裁剪

Python遥感开发之批量掩膜和裁剪1.使用arcpy进行批量掩膜1.1 批量掩膜代码1.2 单个掩膜代码2.使用GDAL进行批量掩膜3.使用rasterio进行批量裁剪前言&#xff1a;主要介绍了使用arcpy、gdal、rasterio对遥感影像进行批量掩膜和裁剪。 1.使用arcpy进行批量掩膜 注意&#xff1a;…

Spring Boot——日志文件

文章目录1.日志的作用2.日志的用法3.自定义日志打印日志格式的说明4.日志级别5.在配置文件中设置日志级别5.1设置全局的日志级别和局部文件夹的日志级别6. 日志持久化7. 更简单的日志输出-lombok1.日志的作用 日志的作用&#xff1a;用来排除和定位问题 通过日志还可以具有以…

Greenplum数据库故障排查及修复

场景一&#xff1a;gp服务正常&#xff0c;存在部分segment实例丢失 1、异常现象 主节点切换gpadmin用户输入gpstate查看状态 如果红色框内有指向左边的箭头则说明存在部分segment实例丢失。 2、排查思路 首先查看主节点日志&#xff0c;重点关注发生segment丢失那段时间的…

【ML特征工程】第 3 章 :文本数据:扁平化、过滤和分块

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

关于SD-WAN的十问十答(最强攻略戳这里)

1. WAN和SD-WAN之间的区别&#xff1f; 从底层来看&#xff0c;相较基于硬件物理设施的WAN&#xff0c;SD-WAN是一种覆盖现有网络的软件技术&#xff0c;是部署在物理基础设施下层的流量管理网络。 和常规WAN相比&#xff0c;SD-WAN具有虚拟WAN体系结构和软件驱动技术&#xff…

[附源码]java毕业设计圆梦山区贫困学生助学系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

EasyRecovery适用于Windows和Mac的专业硬盘恢复软件

电脑中的数据文件对很多的小伙伴来说都是非常重要的&#xff0c;在下载安装新的软件设备时都需要非常谨慎&#xff0c;一旦碰到一些问题就可能会导致文件丢失&#xff0c;想要恢复这些文件并不是很容易&#xff0c;需要使用专业的数据恢复工具才可以对其进行恢复&#xff0c;那…

考研数据结构填空题整合_做题版

考研数据结构填空题整合 目录考研数据结构填空题整合一、ZYL组ZYL组一ZYL组二ZYL组三ZYL组四ZYL组五ZYL组六ZYL组七ZYL组八二、TJP组TJP组一TJP组二TJP组三三、LZH组LZH 组一LZH 组二LZH 组三LZH 组四LZH 组五LZH 组六LZH 组七四、LB组LB组一LB组二LB组三LB组四LB组五LB组六LB组…

2022年戈登·贝尔奖授予等离子体加速器突破研究

ACM 总裁Cherri Pancake&#xff08;图片来源&#xff1a;网络&#xff09; 11月17日&#xff0c;在达拉斯举行的SC22颁奖典礼上&#xff0c;ACM将2022年戈登贝尔奖&#xff08;Gordon Bell Prize&#xff09;授予了一组研究人员&#xff0c;他们利用四台超级计算机&#xff08…

kill-9 用时一时爽,悔恨火葬场!!!

目录 前言 kill -9 和kill -15的区别 常见的信号值有&#xff1a; 信号值9和15的区别&#xff1a; 总结 前言 相信很多程序员对于Linux系统都不陌生&#xff0c;即使自己的日常开发机器不是Linux&#xff0c;那么线上服务器也大部分都是的&#xff0c;所以&#xff0c;掌…

Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、拖动条和滑动条 拖动条SeekBar继承自进度条ProgressBar&#xff0c;它与进度条的不同之处在于&#xff0c;进度条只能在代码中修改进度值&#xff0c;不能由用户改变进度值&#xff0c;拖动条不仅可以在代码中修改进度值&#xf…

ONE 2.0应用场景解读 | 如何通过时序拓扑直观还原故障传导链路?

近年来&#xff0c;随着数字化转型的不断推进&#xff0c;电子商务发展迅速&#xff0c;推动人们的购物行为随之发生转变&#xff0c;在线购物已成为人们的主要购物方式之一。相关数据表明&#xff0c;超过九成的中国网民使用过在线购物平台。 面对庞大的在线用户流量&#xf…

KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

1.kmp算法基本介绍 KMP 是一个解决模式串在文本串是否出现过&#xff0c;如果出现过&#xff0c;最早出现的位置的经典算法。Knuth-Morris-Pratt 字符串查找算法&#xff0c;简称为 “KMP 算法”&#xff0c;常用于在一个文本串 S 内查找一个模式串 P 的出现位置&#xff0c;这…

使用koa框架部署项目

将打包好的代码打包上线&#xff0c;并在nodejs中代理跨域 前端工程师完成开发流程&#xff0c;按照常规的做法&#xff0c;此时&#xff0c;运维会将我们的代码部署到阿里云的ngix服务上&#xff0c;对于我们而言&#xff0c;我们可以将其部署到本机的nodejs环境中 企业代码部…