【发布时间】:2018-05-06 00:17:08
【问题描述】:
在一次采访中,有人问我一个大数据问题,其中给出了具有以下架构的数据集
UserId, MovieId, Rating
这里每一行都有用户对电影数据的评分。因此,根据用户观看的电影给出评分(评分基于用户观看的持续时间,或其他一些无关紧要的标准)。
问题陈述是为每个评分超过 7 且用户尚未观看的 UserId 获取评分最高的 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 过滤 LoadFile; UsersMovieList = foreach RatingGreaterThan7 生成 UserId、MovieId; CrossJoin = 交叉 DistinctUsers、UsersMovieList; FilterMovies = 按 NOT(DistinctUsers::UserId == UsersMovieList::UserId) 过滤 CrossJoin; UsersMovie = foreach FilterMovies 生成 DistinctUsers::UserId 作为 UserId,UsersMovieList::MovieId 作为 MovieId; FilterAlreadyWatched = JOIN UsersMovie by (UserId, MovieId) LEFT OUTER , LoadFile by (UserId, MovieId); FilterAlreadyWatched1 = FILTER FilterAlreadyWatched by (LoadFile::UserId 为 null AND LoadFile::MovieId 为 null); UserMovieWatchList = foreach FilterAlreadyWatched1 生成 UsersMovie::UserId, UsersMovie::MovieId; 使用 PigStorage('\t'); 将 UserMovieWatchList 存储到 '$output' 中;
【问题讨论】:
标签: apache-spark mapreduce bigdata apache-pig