大数据之Hive 实战 完整使用(第十一章)

青旅半醒 2022-09-14 11:23 254阅读 0赞

大数据之Hive 实战 完整使用

  • 一、需求描述
  • 二、数据结构
    • 1)视频表
    • 2)用户表
  • 三、准备表
    • 1)需要准备的表
    • 2)创建原始数据表
    • 2)创建 orc 存储格式带 snappy 压缩的表
  • 四、业务分析、
    • 1、统计视频观看数 Top10
    • 2、统计视频类别热度 Top10
    • 3、统计出视频观看数最高的 20 个视频的所属类别以及类别包含Top20 视频的个数
    • 4、统计视频观看数 Top50 所关联视频的所属类别排序
    • 5、统计每个类别中的视频热度 Top10,以 Music 为例
    • 6、统计每个类别视频观看数 Top10
    • 7、统计上传视频最多的用户 Top10 以及他们上传的视频 观看次数在前 20 的视频

一、需求描述

  1. 统计硅谷影音视频网站的常规指标,各种 TopN 指标:
  2. -- 统计视频观看数 Top10
  3. -- 统计视频类别热度 Top10
  4. -- 统计出视频观看数最高的 20 个视频的所属类别以及类别包含 Top20 视频的个数
  5. -- 统计视频观看数 Top50 所关联视频的所属类别排序
  6. -- 统计每个类别中的视频热度 Top10,以 Music 为例
  7. -- 统计每个类别视频观看数 Top10
  8. -- 统计上传视频最多的用户 Top10 以及他们上传的视频观看次数在前 20 的视频

二、数据结构

1)视频表

在这里插入图片描述

2)用户表

在这里插入图片描述

三、准备表

1)需要准备的表

  1. 创建原始数据表:gulivideo_origulivideo_user_ori
  2. 创建最终表:gulivideo_orcgulivideo_user_orc

2)创建原始数据表

(1)gulivideo_ori

  1. create table 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>)
  12. row format delimited fields terminated by "\t"
  13. collection items terminated by "&"
  14. stored as textfile;

(2)创建原始数据表: gulivideo_user_ori

  1. create table gulivideo_user_ori(
  2. uploader string,
  3. videos int,
  4. friends int)
  5. row format delimited
  6. fields terminated by "\t"
  7. stored as textfile;

2)创建 orc 存储格式带 snappy 压缩的表

(1)gulivideo_orc

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

(2)gulivideo_user_orc

  1. create table gulivideo_user_orc(
  2. uploader string,
  3. videos int,
  4. friends int)
  5. row format delimited
  6. fields terminated by "\t"
  7. stored as orc
  8. tblproperties("orc.compress"="SNAPPY");

(3)向 ori 表插入数据

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

(4)向 orc 表插入数据

  1. insert into table gulivideo_orc select * from gulivideo_ori;
  2. insert into table gulivideo_user_orc select * from gulivideo_user_ori;

四、业务分析、

1、统计视频观看数 Top10

思路:使用 order by 按照 views 字段做一个全局排序即可,同时我们设置只显示前 10
条。

  1. SELECT
  2. videoId, views
  3. FROM
  4. gulivideo_orc ORDER BY
  5. views DESC LIMIT 10;

2、统计视频类别热度 Top10

思路:
(1)即统计每个类别有多少个视频,显示出包含视频最多的前 10 个类别。
(2)我们需要按照类别 group by 聚合,然后 count 组内的 videoId 个数即可。
(3)因为当前表结构为:一个视频对应一个或多个类别。所以如果要 group by 类别, 需要先将类别进行列转行(展开),然后再进行 count 即可。
(4)最后按照热度排序,显示前 10 条。

  1. SELECT
  2. t1.category_name , COUNT(t1.videoId) hot
  3. FROM ( SELECT
  4. videoId, category_name
  5. FROM
  6. gulivideo_orc
  7. lateral VIEW explode(category) gulivideo_orc_tmp AS category_name
  8. ) t1 GROUP BY
  9. t1.category_name ORDER BY
  10. hot DESC LIMIT 10

3、统计出视频观看数最高的 20 个视频的所属类别以及类别包含Top20 视频的个数

思路:
(1)先找到观看数最高的 20 个视频所属条目的所有信息,降序排列
(2)把这 20 条信息中的 category 分裂出来(列转行)
(3)最后查询视频分类名称和该分类下有多少个 Top20 的视频

  1. SELECT
  2. t2.category_name,
  3. COUNT( t2.videoId ) video_sum
  4. FROM
  5. (
  6. SELECT
  7. t1.videoId,
  8. category_name
  9. FROM
  10. ( SELECT videoId, views, category FROM gulivideo_orc ORDER BY views DESC LIMIT 20 ) t1 lateral VIEW explode ( t1.category ) t1_tmp AS category_name
  11. ) t2
  12. GROUP BY
  13. t2.category_name

4、统计视频观看数 Top50 所关联视频的所属类别排序

  1. SELECT
  2. t6.category_name,
  3. t6.video_sum,
  4. rank() over ( ORDER BY t6.video_sum DESC ) rk
  5. FROM
  6. (
  7. SELECT
  8. t5.category_name,
  9. COUNT( t5.relatedid_id ) video_sum
  10. FROM
  11. (
  12. SELECT
  13. t4.relatedid_id,
  14. category_name
  15. FROM
  16. (
  17. SELECT
  18. t2.relatedid_id,
  19. t3.category
  20. FROM
  21. (
  22. SELECT
  23. relatedid_id
  24. FROM
  25. ( SELECT videoId, views, relatedid FROM gulivideo_orc ORDER BY views DESC LIMIT 50 ) t1 lateral VIEW explode ( t1.relatedid ) t1_tmp AS relatedid_id
  26. ) t2
  27. JOIN gulivideo_orc t3 ON t2.relatedid_id = t3.videoId
  28. ) t4 lateral VIEW explode ( t4.category ) t4_tmp AS category_name
  29. ) t5
  30. GROUP BY
  31. t5.category_name
  32. ORDER BY
  33. video_sum DESC
  34. ) t6

5、统计每个类别中的视频热度 Top10,以 Music 为例

思路:
(1)要想统计 Music 类别中的视频热度 Top10,需要先找到 Music 类别,那么就需要将
category 展开,所以可以创建一张表用于存放 categoryId 展开的数据。
(2)向 category 展开的表中插入数据。
(3)统计对应类别(Music)中的视频热度。 统计 Music 类别的 Top10(也可以统计其他)

  1. SELECT
  2. t1.videoId,
  3. t1.views,
  4. t1.category_name
  5. FROM
  6. ( SELECT videoId, views, category_name FROM gulivideo_orc lateral VIEW explode ( category ) gulivideo_orc_tmp AS category_name ) t1
  7. WHERE
  8. t1.category_name = "Music"
  9. ORDER BY
  10. t1.views DESC
  11. LIMIT 10

6、统计每个类别视频观看数 Top10

  1. SELECT
  2. t2.videoId,
  3. t2.views,
  4. t2.category_name,
  5. t2.rk
  6. FROM
  7. (
  8. SELECT
  9. t1.videoId,
  10. t1.views,
  11. t1.category_name,
  12. rank() over ( PARTITION BY t1.category_name ORDER BY t1.views DESC ) rk
  13. FROM
  14. ( SELECT videoId, views, category_name FROM gulivideo_orc lateral VIEW explode ( category ) gulivideo_orc_tmp AS category_name ) t1
  15. ) t2
  16. WHERE
  17. t2.rk <= 10

7、统计上传视频最多的用户 Top10 以及他们上传的视频 观看次数在前 20 的视频

思路:
(1)求出上传视频最多的 10 个用户
(2)关联 gulivideo_orc 表,求出这 10 个用户上传的所有的视频,按照观看数取前 20

  1. SELECT
  2. t2.videoId,
  3. t2.views,
  4. t2.uploader
  5. FROM
  6. ( SELECT uploader, videos FROM gulivideo_user_orc ORDER BY videos DESC LIMIT 10 ) t1
  7. JOIN gulivideo_orc t2 ON t1.uploader = t2.uploader
  8. ORDER BY
  9. t2.views DESC

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读