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

article/2025/10/3 12:11:21

文章目录

  • 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;t1select
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;t1select
explode(category) category_name
from t1;t2select
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;t1select
explode(relatedId) relatedId_id
from t1;t2select
category
from t2
join gulivideo_orc t3
on t2.relatedId_id = t3.videoId;t4select
explode(category) category_name
from t4;t5select
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;t1select
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;t1select
videoId,
views,
category_name
rank() over(partition by t1.category_name order by t1.views desc) rk
from t1;t2select
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;t1select
videoId,
views,
t2.uploader 
from t1 
join gulivideo_orc g
on t1.uploader = g.uploader;t2select
videoId,
views,
uploader,
rank()over(partition by uploader order by views desc) rk
from t2;t3select
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://chatgpt.dhexx.cn/article/DG71Z5C4.shtml

相关文章

【大数据处理技术】实验4

安装MongoDB&#xff08;Ubuntu版本&#xff1a;22.04 LTS&#xff09; 0.查看Ubuntu版本 命令&#xff1a;lsb_release -a 1.使用Ubuntu命令安装 &#xff08;1&#xff09;更新系统包&#xff1a; sudo apt update&#xff08;可选&#xff09; sudo apt upgrade&#x…

大数据处理的五大关键技术及其应用

数据处理是对纷繁复杂的海量数据价值的提炼,而其中最有价值的地方在于预测性分析,即可以通过数据可视化、统计模式识别、数据描述等数据挖掘形式帮助数据科学家更好的理解数据,根据数据挖掘的结果得出预测性决策。其中主要工作环节包括:   大数据采集、大数据预处理、大数…

大数据技术原理与应用----大数据处理架构Hadoop

一、Hadoop简介及其应用现状 1、Hadoop简介 Hadoop&#xff08;是大数据技术的集合体&#xff0c;一整套解决方案的统称&#xff09;是由Java开发的&#xff0c;支持多种编程语言。 2、Hadoop的理论基础 &#xff08;1&#xff09;Hadoop的两大核心 ①分布式文件系统&#x…

浅析大数据分析技术

随着大数据时代的到来&#xff0c;在大数据观念不断提出的今天&#xff0c;加强数据大数据挖掘及时的应用已成为大势所趋。大数据分析处理是对纷繁复杂的海量数据价值的提炼&#xff0c;而其中最有价值的地方在于预测性分析&#xff0c;即可以通过数据可视化、统计模式识别、数…

大数据系统及分析技术

大数据 IDC将大数据技术定义为&#xff1a;“为更经济地从高频率的、大容量的、不同结构和类型的数据中获取价值而设计的新一代架构和技术。” 大数据的关键在于种类繁多、数量庞大、使用传统的数据分析工具无法在可容忍的时间内处理相应的数据。大数据分析主要涉及两个不同的领…

【大数据处理技术】实验6

目录 1. 安装pig大数据分析工具 1.1 pig介绍 1.1.1 Pig简介 1.1.2 Apache Pig 与 MapReduce 1.1.3 Apache Pig 与 SQL 1.1.4 Apache Pig 与 Hive 1.1.5 Apache Pig的应用 1.2 pig下载及安装 1.3 配置环境变量 1.4 pig启动 2. pig工具使用方法 2.1 pig工具简单解析 …

【大数据处理技术】实验3

一、安装Eclipse 1.下载Eclipse&#xff08;我使用Xftp传输的&#xff0c;大家可以直接在虚拟机中下载&#xff09; 下载链接&#xff1a;https://www.eclipse.org/downloads/package 2.解压Eclipse 3.桌面显示Eclipse图标 在终端输入&#xff1a;cd /usr/share/application…

处理大数据需要哪些技术

大数据之所以能够从概念走向落地&#xff0c;说到底还是因为大数据处理技术的成熟&#xff0c;面对海量的数据&#xff0c;在有限的硬件条件下&#xff0c;以低成本满足大数据处理的各种实际需求。那么具体处理大数据需要哪些技术&#xff0c;今天我们来简单介绍一下大数据核心…

干货 | 大数据处理技术的总结与分析

一 、数据分析处理需求分类 1、事务型处理 在我们实际生活中&#xff0c;事务型数据处理需求非常常见&#xff0c;例如&#xff1a;淘宝网站交易系统、12306网站火车票交易系统、超市POS系统等都属于事务型数据处理系统。 这类系统数据处理特点包括以下几点&#xff1a; 一是事…

大数据技术介绍

为了方便大家梳理清楚大数据学习路线&#xff0c;本文从以下四个方面来介绍大数据技术&#xff1a; 大数据技术栈 大数据发展史 大数据应用 大数据开发岗位 一、大数据技术栈 之前有同事问我怎么转大数据开发&#xff0c;他在网上搜了一堆大数据相关的技术&#xff0c;但是不…

大数据时代:大数据处理技术及采集方法

在大数据时代&#xff0c;传统的大数据处理技术还管用吗? 大数据处理环节下的需求 大数据环节下的数据来源是非常多&#xff0c;而且类型也很多花样&#xff0c;存储和数据处理的需求量很大&#xff0c;对于数据展现也非常的高&#xff0c;并且很看重数据处理的高效性和可用…

大数据处理的关键技术有哪些?

数据关键技术涵盖数据存储、处理、应用等多方面的技术&#xff0c;根据大数据的处理过程&#xff0c;可将其分为大数据采集、大数据预处理、大数据存储及管理、大数据处理、大数据分析及挖掘、大数据展示等。 1、大数据采集技术 大数据采集技术是指通过 RFID 数据、传感器数据…

大数据处理关键技术主要有五种,具体指的是什么?

大数据技术 ,就是从各种类型的数据中快速获得有价值信息的技术。 大数据 领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。大数据处理关键技术一般包括:大数据采集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据展现和应用…

数据分析|SQL面试题集锦

https://zhuanlan.zhihu.com/p/136619982 https://www.cnblogs.com/diffrent/p/8854995.html 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王…

Sql面试50题 详解 持续更新

Sql面试50题 前言&#xff1a;此文章是根据【数据分析】- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家 学习整理而来&#xff0c;仅供复习参考。 建表与插入数据 --建立学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_bi…

大厂SQL面试题,连续时间问题

今天分享一个非常常考&#xff0c;同时也不太容易的sql题目类型&#xff0c;求连续时间问题。 这类题的核心是&#xff1a;分组排序&#xff0c;用时间减去排序&#xff0c;如果连续的话他们的差会是相同值 记住下面的表&#xff0c;按照提供的三步思路理清楚里面的数据逻辑&a…

经典Hive-SQL面试题及答案

目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/…

吊打面试官之SQL面试题30问及答案

经典SQL30问一: 编写查询,查找表中的行总数。编写查询,消除表结果中的重复记录。编写查询,获取t_employee表中designation字段前3个字符。查询t_employee表,合并输出Designation和Department两个字段的内容。如果使用union和union all合并4条SQL子查询,union会有多少次被用来去…

pl sql面试题_PL SQL面试问答

pl sql面试题 If you have worked on Oracle database and going for an interview, you should go through PL SQL interview questions and answers. 如果您曾经在Oracle数据库上工作过并且要进行面试,则应该阅读PL SQL面试问题和答案。 PLSQL stands for Procedural Langu…

常见的sql面试题

本章是SQL面试题的汇总,之后还会不断更新,文章的思维导图如下: 1.SQL初级查询 单表查询 -- 查询学生表中有几名学生的信息.显示学号 select distinct 学号 from student;查询条件 -- 查询学生表中性别为女的学生所有信息 SELECT * FROM student WHERE 性别女;结果排序 -- …