我正在对分布式系统进行考试,并且试图解决去年的考试中的MapReduce问题。但是我很难弄清楚我将创建什么MR功能。该练习是关于处理包含{userID,movieID,时间戳记}的数据集的。我们希望构建一种在向用户推荐电影之后向其推荐电影的服务。 用户(id)已在元组中观看了电影(id)。要推荐另一部电影,您需要这样计算“ Jaccard相似度”:
Jaccard(X,Y)= N /(Nx + Ny-N),其中:
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?在此先感谢您提供任何解释。如果您想更好地解释练习的数据,请询问。
答案 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