文章目录

  • 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;
  • 由于数据不全,所有没有查询到数据

大数据开发——Hive实战案例相关推荐

  1. 大数据开发hive数据库常用命令汇总

    在大数据学习当中,尤其是Hadoop生态的学习当中,Hive是必备的,也是相对门槛较低,比较好入手的一个组件.今天的大数据开发分享,和大家分享Hive的基础知识点. Hive简介 根据官方文档的定义, ...

  2. 大数据开发的前景和就业如何?该如何去学习它?

    此前,BOSS直聘研究院发布的< 2022 年春季就业市场趋势观察>指出,受到 2021 年政策调控的影响,互联网行业的高速扩张开始降温. 2022年春季,互联网行业的招聘规模虽然仍然保持 ...

  3. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  4. 大数据开发实战:Hive表DDL和DML

    1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name [ (col_nam ...

  5. hive 行转列和列转行的方法_读离线和实时大数据开发实战,为你揭开 Hive 优化实践的神秘面纱...

    前言 「1024,1GB,一级棒!程序仔们节日快乐!」 ❝ 指尖流动的 1024 行代码,到底是什么? ❞ ❝ 是10行的迷茫?是101行的叛逆?是202行的理性思考?是307行对渴望的冲动?还是40 ...

  6. 《黑马程序员2023新版黑马程序员大数据入门到实战教程,大数据开发必会的Hadoop、Hive,云平台实战项目》学习笔记总目录

    本文是对<黑马程序员新版大数据入门到实战教程>所有知识点的笔记进行总结分类. 学习视频:黑马程序员新版大数据 学习时总结的学习笔记以及思维导图会在后续更新,请敬请期待. 前言:配置三台虚拟 ...

  7. 视频教程-大数据电视收视率实战项目教程(企业级案例)-Spark

    大数据电视收视率实战项目教程(企业级案例) 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥 ...

  8. 大数据开发实战教程目录

    大数据开发实战教程目录 一. 课程性质.目的和任务 本课程目的是让学生了解并掌握四个领域 (1)大数据系统的起源及系统特征 (2)大数据系统的架构设计及功能目标设计 (3)大数据系统程序开发.企业大数 ...

  9. BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略

    BigData:大数据开发的简介.核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS.HBase.Hive}+Docker).经典场景应用之详细攻略 BigData:大数 ...

最新文章

  1. python语言的理解-Python动态语言理解
  2. 机器学习算法与Python实践之(二)支持向量机(SVM)初
  3. GDCM:gdcm::ServiceClassUser的测试程序
  4. Go 还是需要泛型的
  5. JavaScript快速学习
  6. Django(part4)--练习及re_path方法
  7. Solr管理页面 上
  8. 程序员面试金典 - 面试题 08.03. 魔术索引(二分递归)
  9. Java 8 Stream Api 中的 peek、map、foreach区别
  10. C++ 程序员如何迎接 Windows 10 的到来
  11. iis php.exe,在IIS75下使用php运行exe程序的总结
  12. 为什么没有普及128位操纵系统的计算机?
  13. Android开发——联系人中几种常见的mimetype、几张常见表的Uri
  14. AngularJS------报错The selector app-user-item did not match any elements
  15. 15.导入网表及status介绍[原创]
  16. Bootstarp daterangepicker 日期控件
  17. net-snmp的定制编译
  18. iec104规约遥测遥信解析笔记
  19. 航空订票系统java_航空订票系统(JAVA+SSH+MYSQL)
  20. 《郦波评说曾国藩家训》书摘

热门文章

  1. 2-1. Python 数据类型、运算
  2. Libp2p - IPFS 与 Polkadot :双剑合璧会有时
  3. 建设网站对服务器配置的要求标准?
  4. 成功的项目经理,都具有这6种特质
  5. 脚本木马的制作与原理
  6. 边缘计算网关是什么?有什么功能和特点?
  7. UE4开发PSVR游戏的常见问题
  8. mysql bulkupdate_django_bulk_update源码分析
  9. 计算机蓝屏代码的含义
  10. js 监听输入法组合文字过程