与二度好友的区别,参见《Hadoop/Spark推荐系统(四)——推荐链接(二度好友)》部分
###输入
mapper-input: #好友关系是对称的,整个数据的关系边是偶数
(u1,[f1,f2,f3])
(u2,[f2,f3])
(f1,[u1,f3])
(f2,[u1,u2])
(f3,[u1,u2,f1])
###mapper-output
将一条用户的好友列表数据,拆成这个用户每个好友对为key的表示形式(key的表示字母或数字有序),value依然为好友里列表形式,共12组
([f1,u1],[f1,f2,f3])
([f2,u1],[f1,f2,f3])
([f3,u1],[f1,f2,f3])
([f2,u2],[f2,f3])
([f3,u2],[f2,f3])
([f1,u1],[u1,f3])
([f1,f3],[u1,f3])
([f2,u1],[u1,u2])
([f2,u2],[u1,u2])
([f3,u1],[u1,u2,f1])
([f3,u2],[u1,u2,f1])
([f3,f1],[u1,u2,f1])
###shuffle-output
依照对称性,key相同的合并,数量正好减少一半,为6组
([f1,u1],[f1,f2,f3],[u1,f3])
([f2,u1],[f1,f2,f3],[u1,u2])
([f3,u1],[f1,f2,f3],[u1,u2,f1])
([f2,u2],[f2,f3],[u1,u2])
([f3,u2],[f2,f3],[u1,u2,f1])
([f1,f3],[u1,f3],[u1,u2,f1])
###reduce-output
找出value里的两个list里重复的元素,即为共同好友
([f1,u1],[f3])
([f2,u1],[])
([f3,u1],[f1])
([f2,u2],[])
([f3,u2],[])
([f1,f3],[u1])
##MR版本
map(key,value){
reduceValue=(...)
foreach friend in (...){
reduceKey=buildSortedKey(person,friend)
emit(reducerKey,reducerValue);
}
}
reduce(key,value){
outputValue=intersection(List_1,List_2,...,List_M)
emit(key,outputCalue);
}
##Spark版本
map(P,{F_1,F_2,...,F_n}){
friends={F_1,F_2,...,F_N};
for(f:friends){
key = buildSortedTuple(P,f);
emit(key,friends);
}
}
reduce(key,values){
commonFriends=intersection(values);
emit(key,friends)
}