向導
數據結構
視頻表
用戶表
需求描述
統計影音視頻網站的常規指標,各種TopN指標:
- 統計視頻觀看數Top10
- 統計視頻類別熱度Top10
- 統計出視頻觀看數最高的20個視頻的所屬類別以及類別包含Top20視頻的個數
- 統計視頻觀看數Top50所關聯視頻的所屬類別排序
- 統計每個類別中的視頻熱度,視頻流量,觀看數Top10
- 統計上傳視頻最多的用戶Top10以及他們上傳的觀看次數在前20的視頻
解答
1. 統計視頻觀看數Top10
思路:使用order by按照views字段做一個全局排序即可,同時我們設置只顯示前10條。
最終代碼:
select video_id, views from video_orc order by views desc limit 10;
- 1
2. 統計視頻類別熱度Top10
思路: 以某類視頻的個數作為視頻類別熱度。
- 即統計每個類別有多少個視頻,顯示出包含視頻最多的前10個類別。
- 我們需要按照類別group by聚合,然后count組內的videoId個數即可。
- 因為當前表結構為:一個視頻對應一個或多個類別。所以如果要group by類別,需要先將類別進行列轉行(展開),然后再進行count即可。
- 最后按照熱度排序,顯示前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視頻的個數
思路:
- 先找到觀看數最高的20個視頻所屬條目的所有信息,降序排列
- 把這20條信息中的category分裂出來(列轉行)
- 最后查詢視頻分類名稱和該分類下有多少個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所關聯視頻的所屬類別排序
思路:
- 查詢出觀看數最多的前50個視頻的所有信息(當然包含了每個視頻對應的關聯視頻),記為臨時表t1
- 將找到的50條視頻信息的相關視頻relatedId列轉行,記為臨時表t2
- 將相關視頻的id和video_orc表進行inner join操作
- 炸裂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
思路:
- 炸裂類別一列,分組倒敘排序,取前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的視頻
思路:
- 先找到上傳視頻最多的10個用戶的用戶信息
- 通過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