我正在进行分布式系统考试,我试图解决去年考试中的一个MapReduce问题。但我很难弄清楚我将创建什么样的函数。本练习涉及处理包含{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)重要: reduce_1用于e.x的输出。必须是map_2的输入。
这不是作业,因为它是过去的期末考试,这就是为什么我不把它放在家庭作业的问题。(如果需要,可以提供到考试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?谢谢您的任何解释。如果你想更好地解释练习的日期,请问。
发布于 2019-01-18 14:37:50
map/ map部分将每个输入记录转换为(键->值)对。
输入记录-> x映射函数-> f在输入记录-> f(x)上的映射输出
在您的特定示例中,通过丢弃时间戳将{userID、movieID、时间戳}的元组转换为键值映射(movieId -> userId)。
map/ reduce的部分接受您从上面创建的每个键值映射,并执行一个聚合函数(减)。由于一个key的所有数据都需要位于一个节点上才能执行精确的聚合计算,所以特定key的值将被移动到负责该key的特定节点。这就是为什么reduce接受输入作为(键->列表(值))或示例(movieId -> List(userIds))的原因。因此,对每个reduce调用来说,key将是不同的。
对于每个输入键,reduce函数的输出将是唯一的(键-> aggregation_computation(值))。例如,在你的例子中,
Movie (Id) Number of Users
Star Wars 50
John Wick 32
Fifty Shades of Grey 9000
...https://stackoverflow.com/questions/54219015
复制相似问题