电影推荐的MapReduce Jaccard相似度计算

时间:2019-01-16 14:16:15

标签: mapreduce reduce recommendation-engine

我正在对分布式系统进行考试,并且试图解决去年的考试中的MapReduce问题。但是我很难弄清楚我将创建什么MR功能。该练习是关于处理包含{userID,movieID,时间戳记}的数据集的。我们希望构建一种在向用户推荐电影之后向其推荐电影的服务。 用户(id)已在元组中观看了电影(id)。要推荐另一部电影,您需要这样计算“ Jaccard相似度”:

Jaccard(X,Y)= N /(Nx + Ny-N),其中:

  • Nx =看过电影X的用户数
  • Ny =看过电影Y的用户数
  • N =看过电影X和Y的用户数量

MR功能必须使用伪代码如下:

MAP(key1, value1):
  // Do stuff about<key1,value1>
  emit(key2,value2)


REDUCE(key2,list(value2)):
  //do stuff about <key2, list(value2)>
  emit(key3,value3)

重要提示:用于e.x的reduce_1的输出。必须是map_2的输入。

P.S .:这不是一项家庭作业,因为它是过去的期末考试,所以我不将其放在“家庭作业问题”中。 (如果需要,可以提供指向考试pdf的链接)

我已经尝试过以下方法:

MAP(key1, value1):
  //key = tupleID
  // value1 = {userID, movieID, timestamp}
  // I discard timestamp as it doesn't offer any help on creating 
     Jaccard similarity.
  emit(movieID,userID)


REDUCE(movieID,list(userID)):
  Nx = 0
  for each user u in list(userID):
     Nx = Nx +1
  emit(movieID,Nx)

我不知道下一步该怎么做。我还不了解MR背后的逻辑,因为第二个MR将作为输入获得什么。例如,MovieID会保持不变,还是会获取数据集中的下一个movieID?在此先感谢您提供任何解释。如果您想更好地解释练习的数据,请询问。

1 个答案:

答案 0 :(得分:0)

map / reduce的map部分将每个输入记录转换(映射)为(键->值)对。

输入记录-> x 地图功能-> f 输入记录上的地图功能输出-> f(x)

在您的特定示例中,您正在通过丢弃时间戳将{userID,movieID,timestamp}的元组转换为键值映射(movieId-> userId)。

map / reduce的reduce部分采用您从上面创建的每个键-值映射,并执行聚合功能(reduce)。由于一个key的所有数据都必须位于一个节点上才能执行准确的聚合计算,因此特定key的值将移至负责该{{1}的特定节点}。这就是key将输入作为(key-> List(value))或例如(movieId-> List(userIds))作为输入的原因。因此,对于每个reduce调用,reduce都会有所不同。

对于每个输入键,key函数的输出将是唯一的(键-> aggregation_computation(值))。例如,您的情况

reduce