hive 经典题——用户商品推荐之朋友的收藏夹

这是是一个推荐SQL,对用户的推荐用户朋友收藏但是自己并没有收藏的商品

SELECT
		DISTINCT user1_id user_id,sku_id
FROM(
SELECT
	user1_id,All_sku_id,user2_id,sku_id	
FROM(
SELECT
	t1.user1_id,All_sku_id,user2_id
FROM(
SELECT
	DISTINCT  user1_id,
    user2_id
FROM(
SELECT user1_id,user2_id FROM friendship_info
UNION
SELECT user2_id as user1_id,user1_id as user2_id FROM friendship_info)t
  )t1
JOIN (SELECT user_id,collect_set(sku_id) All_sku_id FROM favor_info group by user_id) t2 ON t1.user1_id=t2.user_id 
  )t3 JOIN favor_info f ON t3.user2_id=f.user_id
  )t4 where user1_id<>user2_id AND NOT array_contains(All_sku_id,sku_id)
  ORDER BY user_id,sku_id

总结:这个题本身不难,但是有点绕,把逻辑理清楚了就好了。
我的逻辑是,先找出所有的用户以及他们对应的好友,接着join用户自己的收藏列表,并将这些数据放到一个set集合里面,由于是双面的用户,所以使用去重把互相关注的用户给排除掉。接着能得到一个这样的表,用户自己和,用户自己所收藏的商品。
在这里插入图片描述
接下来就简单了,jion用户朋友的收藏列表,将收藏列表的商品和用户自己所收藏的商品作比较,如果不在就留下,在就排除(说明两个人都有关注)
这里值得注意的是 array_contains(All_sku_id,sku_id)是这个函数,这是一个数据是否在集合里的一个函数,这里的意思就是,sku_id是否在All_sku_id这个集合里面,在就返回TRUE不在就返回false。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值