Hadoop/Spark推荐系统(一)——共同好友

与二度好友的区别,参见《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)
}

你可能感兴趣的:(推荐系统,机器学习,大数据Spark/Hadoop)