0


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

文章目录

1. 创建表结构

1.1 视频表结构

在这里插入图片描述

1.2 用户表结构

在这里插入图片描述

2. 准备工作

2.1 创建临时表

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

创建临时视频表

  1. createtable gulivideo_ori(
  2. videoId string,
  3. uploader string,
  4. age int,
  5. category array<string>,
  6. length int,
  7. views int,
  8. rate float,
  9. ratings int,
  10. comments int,
  11. relatedId array<string>)row format delimited fieldsterminatedby"\t"
  12. collection items terminatedby"&"
  13. stored as textfile;

创建临时用户表

  1. createtable gulivideo_user_ori(
  2. uploader string,
  3. videos int,
  4. friends int)row format delimited
  5. fieldsterminatedby"\t"
  6. stored as textfile;

加载原数据到临时表

  1. loaddatalocal inpath "/opt/module/data/video"intotable gulivideo_ori;loaddatalocal inpath "/opt/module/user"intotable gulivideo_user_ori;

2.2 创建最终使用表

创建视频表

  1. createtable gulivideo_orc(
  2. videoId string,
  3. uploader string,
  4. age int,
  5. category array<string>,
  6. length int,
  7. views int,
  8. rate float,
  9. ratings int,
  10. comments int,
  11. relatedId array<string>)
  12. stored as orc
  13. tblproperties("orc.compress"="SNAPPY");

创建用户表

  1. createtable gulivideo_user_orc(
  2. uploader string,
  3. videos int,
  4. friends int)row format delimited
  5. fieldsterminatedby"\t"
  6. stored as orc
  7. tblproperties("orc.compress"="SNAPPY");

2.3 对创建表进行解读

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

  • 对于用户表- 三个字段都是基本数据类型,行格式字段分割以‘\t’结束,以orc的方式存储,并且设置压缩属性为snappy
  • 视频表- 视频表中视频的类别和视频的相关视频两个字段是数组的方式进行存储的 ,字段之间分隔符为‘\t’,数组中元素的分隔符为‘&’

3. 业务分析

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

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

代码:

  1. select videoId
  2. from gulivideo_orc
  3. orderby views
  4. limit10;

在这里插入图片描述


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

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

步骤代码:

  1. --步骤一使用下列任意一种都可以,第一种使用侧偏移,第二种直接炸裂select
  2. videoId,
  3. category_name
  4. from gulivideo_orc
  5. lateral view explode(category) tmp_category as category_name;t1
  6. select
  7. explode(category) categoru_name
  8. from gulivideo_orc;t1
  9. --第二步代码:select
  10. category_name,count(*) ct
  11. from t1
  12. groupby category_name
  13. orderby ct desclimit10;

最终代码:

  1. select
  2. category_name,count(*) ct
  3. from(select
  4. explode(category) category_name
  5. from gulivideo_orc)t1
  6. groupby category_name
  7. orderby ct desclimit10;

在这里插入图片描述


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

  • 分析 - 第一步:统计观看数最高的二十个视频- 第二步:获取视频的类别- 第三步:按照类别进行分组,获取每一组的视频数(即为每一个类别中包含Top20视频的个数)
  1. select
  2. category
  3. from gulivideo_orc
  4. orderby views desclimit20;t1
  5. select
  6. explode(category) category_name
  7. from t1;t2
  8. select
  9. category_name,count(*) video_sum
  10. from t2
  11. groupby category_name;

最终代码:

  1. select
  2. category_name,count(*) video_sum
  3. from(select
  4. explode(category) category_name
  5. from(select
  6. category
  7. from gulivideo_orc
  8. orderby views desclimit20)t1)t2
  9. groupby category_name;

在这里插入图片描述


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

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

分步代码:

  1. select
  2. relatedId
  3. from gulivideo_orc
  4. orderby views desclimit50;t1
  5. select
  6. explode(relatedId) relatedId_id
  7. from t1;t2
  8. select
  9. category
  10. from t2
  11. join gulivideo_orc t3
  12. on t2.relatedId_id = t3.videoId;t4
  13. select
  14. explode(category) category_name
  15. from t4;t5
  16. select
  17. category_name,count(*) ct
  18. from t5
  19. groupby category_name
  20. orderby ct desc;

代码:

  1. select
  2. category_name,count(*) ct
  3. from(select
  4. explode(category) category_name
  5. from(select
  6. category
  7. from(select
  8. explode(relatedId) relatedId_id
  9. from(select
  10. relatedId
  11. from gulivideo_orc
  12. orderby views desclimit50)t1)t2
  13. join gulivideo_orc t3
  14. on t2.relatedId_id = t3.videoId)t4)t5
  15. groupby category_name
  16. orderby ct desc;

在这里插入图片描述


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

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

分布代码:

  1. select
  2. videoId,
  3. category_name
  4. from gulivideo_orc
  5. lateral view explode(category) tmp_category as category_name;t1
  6. select
  7. videoId,
  8. views,
  9. category_name
  10. from t1
  11. where category_name ="Music"orderby views desclimit10;

代码:

  1. select
  2. videoId,
  3. views,
  4. category_name
  5. from(select
  6. videoId,
  7. views,
  8. category_name
  9. from gulivideo_orc
  10. lateral view explode(category) tmp_category as category_name)t1
  11. where category_name ="Music"orderby views desclimit10;

在这里插入图片描述


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

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

分步代码:

  1. select
  2. videoId,
  3. views,
  4. category_name
  5. from gulivideo_orc
  6. lateral view explode(category) tmp_category as category_name;t1
  7. select
  8. videoId,
  9. views,
  10. category_name
  11. rank()over(partitionby t1.category_name orderby t1.views desc) rk
  12. from t1;t2
  13. select
  14. videoId,
  15. views,
  16. category_name,
  17. rk
  18. from t2
  19. where t2.rk <=10;

代码:

  1. select
  2. videoId,
  3. views,
  4. category_name
  5. rk
  6. from(select
  7. videoId,
  8. views,
  9. category_name,
  10. rank()over(partitionby t1.category_name orderby t1.views desc) rk
  11. from(select
  12. videoId,
  13. views,
  14. category_name
  15. from gulivideo_orc
  16. lateral view explode(category) tmp_category as category_name)t1)t2
  17. where t2.rk <=10;

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


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

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

分布代码:

  1. select
  2. uploader
  3. from
  4. gulivideo_user_orc
  5. orderby videos desclimit10;t1
  6. select
  7. videoId,
  8. views,
  9. t2.uploader
  10. from t1
  11. join gulivideo_orc g
  12. on t1.uploader = g.uploader;t2
  13. select
  14. videoId,
  15. views,
  16. uploader,
  17. rank()over(partitionby uploader orderby views desc) rk
  18. from t2;t3
  19. select
  20. videoId,
  21. views,
  22. uploader
  23. from t3
  24. where rk<=20;

代码:

  1. select
  2. videoId,
  3. views,
  4. uploader,
  5. rank()over(partitionby uploader orderby views desc) rk
  6. from(select
  7. videoId,
  8. views,
  9. t1.uploader
  10. from(select
  11. uploader
  12. from
  13. gulivideo_user_orc
  14. orderby videos desclimit10)t1
  15. join gulivideo_orc g
  16. on t1.uploader = g.uploader) t2;
  • 由于数据不全,所有没有查询到数据在这里插入图片描述

标签: 大数据 hive hadoop

本文转载自: https://blog.csdn.net/weixin_44606952/article/details/128038820
版权归原作者 皮皮皮皮皮皮皮卡乒 所有, 如有侵权,请联系我们删除。

“大数据开发——Hive实战案例”的评论:

还没有评论