bigdata:movies用户建议列表,基于其他用户对电影的评分

zu0ti5jz  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(394)

在一次采访中,我被问及一个bigdata问题,其中给出了具有以下模式的数据集

UserId, MovieId, Rating

这里每一行都有用户对电影数据的评分。因此,根据用户观看的电影给出分级(分级基于用户观看的时间,或者其他一些无关紧要的标准)。
问题是要为每个评分超过7的用户获取最高评分的movieid列表,而这个用户还没有观看。或者基本上是可以推荐给netflix用户的电影列表。
例如下面的数据集

User_123    Movie_442   5
User_123    Movie_434   8
User_123    Movie_487   6
User_123    Movie_423   9
User_415    Movie_442   8
User_415    Movie_994   9
User_993    Movie_884   7
User_993    Movie_887   6
User_993    Movie_883   9

我正在寻找以下输出:-

User_123    Movie_883
User_123    Movie_994
User_415    Movie_423
User_415    Movie_434
User_415    Movie_883
User_993    Movie_423
User_993    Movie_434
User_993    Movie_442
User_993    Movie_994

我有解决这个问题的办法 Apache Pig 但我正在寻找更优化的方法。有人能给我一个更好的解决办法吗
loadfile=使用pigstorage('\t')作为(userid:chararray,movieid:chararray,额定值:int);useridfield=foreach loadfile生成userid;distinctusers=不同的useridfield;ratinggreaterthan7=按评级>7筛选加载文件;usersmovielist=foreach ratinggreater than7生成userid,movieid;crossjoin=cross distinctusers,usersmovielist;filtermovies=filter crossjoin by not(distinctusers::userid==usersmovielist::userid);usersmovie=foreach filtermovies生成distinctusers::userid作为userid,usersmovielist::movieid作为movieid;filteralreadywatched=join usersmovie by(userid,movieid)left outer,loadfile by(userid,movieid);filteralreadywatched1=筛选器filteralreadywatched by(loadfile::userid为空,loadfile::movieid为空);usermoviewatchlist=foreach filteralreadywatched1生成usersmovie::userid,usersmovie::movieid;使用pigstorage('\t')将usermoviewatchlist存储到'$output'中;

wkftcu5l

wkftcu5l1#

如果是面试问题,我会尝试从多个Angular 来看待。
查找分级大于7的所有电影的大小。假设是200 mb,然后我将提取这些数据,写入hdfs。
在pig作业中,使用自定义udf将这些数据加载到reducer内存中(在group by之后),以查找给定用户的新电影。
我甚至可能计划在hbase中加载7级以上的电影,并从reducer(groupby之后)进行查找

  • 交叉连接不是一个可伸缩的解决方案,因为表中的行不断增长。

相关问题