【问题标题】:BigData: Movies suggestion list for Users, based on Other users Rating for a movieBigData:用户的电影建议列表,基于其他用户对电影的评分
【发布时间】: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


    【解决方案1】:

    如果是面试题,我会尝试从多个角度来看。

    1. 查找所有评级 > 7 的电影的大小。说它的 200 MB,然后我将提取此数据,写入 hdfs。
    2. 在 Pig Job 中,通过使用自定义 UDF 将这些数据加载到 Reducer 内存中(在 Group By 之后),以查找给定用户哪些电影对他来说是新的。

      我什至可能计划在 Hbase 中加载评分高于 7 的电影并从 Reducer 进行查找(在 groupby 之后)

    *Cross Join 不是一个可扩展的解决方案,因为表中的行会不断增长。

    【讨论】:

    • 建议很好,但它不可扩展,因为您建议将电影数据存储在内存中。
    • Nopes 只有评分超过 7 的电影。一部电影 10 个字符。 1000 万部电影 = 100 MB。它可以很容易地保存在内存中。您先提取评级 > 7 的电影,然后在内存或 Hbase(键值)中进行处理
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多