Hive 实操案例四:统计视频观看数 Top50 所关联视频的所属类别排序

一、数据表结构

视频表 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 个

二、具体实现

-- 统计视频观看数 Top50 的视频所有相关视频的所属类别排序
/**
  思路:
    1.先按照 videoid 和 relatedid 分组聚合统计观看数
    2.使用排序窗口函数按照观看数降序编号
    3.使用 where 子句获取 top50 的视频的关联视频字段 relatedid
    4.由于 relatedid 字段为 Array 类型,使用 explode 函数将字段扁平化并去重作为结果表 1
    5.再从 t_video 表中使用 explode 函数将 category 字段扁平化作为结果表 2
    6.将结果表 1 和结果表 2 按照视频 id 字段进行关联,并按视频类别分组聚合统计次数,最终按次数降序展示
*/
SELECT 
	b.cg,
	SUM(1) as num 
FROM 
(
	SELECT 
		reId
	FROM 
	(
		SELECT 
			relatedId
		FROM 
		(
			SELECT 
				videoid,
				relatedId,
				DENSE_RANK() over(ORDER by `views` desc) as rn
			FROM 
			(
				SELECT 
					videoid,
					relatedId,
					SUM(`views`) as `views`  
				FROM t_video 
				group by videoid,relatedId 
			) t1
		) t2
		WHERE rn <= 50
	) t3 LATERAL view explode(relatedId) adtable as reId
	group by reId
) a
JOIN 
(
	select
		videoid,
		cg
	FROM t_video tv 
	lateral view explode(category) adtable as cg 
	group by videoid,cg 
) b
on a.reId=b.videoid
GROUP by b.cg
order by num DESC; 
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值