Hive -- Hive面試題及答案sql語句 ---阿善有時間看


 

數據結構

視頻表

在這里插入圖片描述

用戶表

在這里插入圖片描述

需求描述

  統計影音視頻網站的常規指標,各種TopN指標:

  1. 統計視頻觀看數Top10
  2. 統計視頻類別熱度Top10
  3. 統計出視頻觀看數最高的20個視頻的所屬類別以及類別包含Top20視頻的個數
  4. 統計視頻觀看數Top50所關聯視頻的所屬類別排序
  5. 統計每個類別中的視頻熱度,視頻流量,觀看數Top10
  6. 統計上傳視頻最多的用戶Top10以及他們上傳的觀看次數在前20的視頻

解答

1. 統計視頻觀看數Top10

思路:使用order by按照views字段做一個全局排序即可,同時我們設置只顯示前10條。
最終代碼:

select video_id, views from video_orc order by views desc limit 10; 
  • 1

2. 統計視頻類別熱度Top10

思路: 以某類視頻的個數作為視頻類別熱度。

  1. 即統計每個類別有多少個視頻,顯示出包含視頻最多的前10個類別。
  2. 我們需要按照類別group by聚合,然后count組內的videoId個數即可。
  3. 因為當前表結構為:一個視頻對應一個或多個類別。所以如果要group by類別,需要先將類別進行列轉行(展開),然后再進行count即可。
  4. 最后按照熱度排序,顯示前10條。
    最終代碼:
select cate, count(1) cate_cnt from video_orc lateral view explode(category) temp as cate group by cate order by cate_cnt desc limit 10; 
  • 1
  • 2
  • 3

3. 統計出視頻觀看數最高的20個視頻的所屬類別以及類別包含Top20視頻的個數

思路:

  1. 先找到觀看數最高的20個視頻所屬條目的所有信息,降序排列
  2. 把這20條信息中的category分裂出來(列轉行)
  3. 最后查詢視頻分類名稱和該分類下有多少個Top20的視頻
    最終代碼:
select cate, count(1) from ( select category, views from video_orc order by views desc limit 20 ) t_top20 lateral view explode(category) temp as cate group by cate 
  • 1
  • 2
  • 3
  • 4

4. 統計視頻觀看數Top50所關聯視頻的所屬類別排序

思路:

  1. 查詢出觀看數最多的前50個視頻的所有信息(當然包含了每個視頻對應的關聯視頻),記為臨時表t1
  2. 將找到的50條視頻信息的相關視頻relatedId列轉行,記為臨時表t2
  3. 將相關視頻的id和video_orc表進行inner join操作
  4. 炸裂category,按照視頻類別進行分組,統計每組視頻個數,然后排行
select cate, count(1) cate_cnt from ( select t_dis.rel_id, video_orc.category from ( select rel_id from ( select related_ids,views from video_orc order by views desc limit 50 ) t lateral view explode(related_ids) temp as rel_id group by rel_id ) t_dis join video_orc on t_dis.rel_id = video_orc.video_id ) t_join lateral view explode(category) exp_temp as cate group by cate order by cate_cnt desc 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5. 統計每個類別中的視頻熱度,視頻流量,觀看數Top10

思路:

  1. 炸裂類別一列,分組倒敘排序,取前10
    最終代碼:
select * from ( select *, rank() over(partition by cate order by comments desc) rank // rank() over(partition by cate order by ratings desc) rank // rank() over(partition by cate order by views desc) rank from ( select * from video_orc lateral view explode(category) temp as cate ) t_exp ) t_rank where rank <= 10; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6. 統計上傳視頻最多的用戶Top10以及他們上傳的觀看次數在前20的視頻

思路:

  1. 先找到上傳視頻最多的10個用戶的用戶信息
  2. 通過uploader字段與video_orc表進行join,得到的信息再與 views倒敘排前10的join即可
    最終代碼:
select t_join_video.* from ( select v.* from ( select uploader, videos from user_orc order by videos desc limit 10 ) t join video_orc v on t.uploader = v.uploader ) t_join_video join ( select * from video_orc order by views desc limit 10 ) t_views20 on t_join_video.video_id = t_views20.video_id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM