一、数据表结构
视频表 t_video
| 字段 | 注释 | 描述 | 
|---|---|---|
| videoId | 视频唯一 id(String) | 11 位字符串 | 
| uploader | 视频上传者(String) | 上传视频的用户名 String | 
| age | 视频年龄(int) | 视频在平台上的整数天 | 
| category | 视频类别( Array<String>) | 上传视频指定的视频分类 | 
| length | 视频长度(Int) | 整形数字标识的视频长度 | 
| views | 观看次数(Int) | 视频被浏览的次数 | 
| rate | 视频评分(Double) | 满分 5 分 | 
| Ratings | 流量(Int) | 视频的流量,整型数字 | 
| conments | 评论数(Int) | 一个视频的整数评论数 | 
| relatedId | 相关视频 id( Array<String>) | 相关视频的 id,最多 20 个 | 
二、具体实现
-- 统计每个类别中的视频热度 Top10
/**思路:1.先使用 explode 函数将 category 字段扁平化2.按照 videoid 和 扁平化后的类别字段分组聚合统计观看次数3.使用排序窗口函数按类别分组、观看次数降序排序进行组内编号4.使用 where 子句筛选每个类别组内的 top10 数据
*/
SELECT cg,videoid,`views`,rn
FROM 
(SELECT cg,videoid,`views`,DENSE_RANK() over(PARTITION by cg ORDER by `views` desc) as rn FROM (SELECT videoid,cg,SUM(`views`) as `views`FROM t_video gv lateral view explode(category) adtable as cg group by cg, videoid ) t1
) t2
WHERE rn <= 10;