大数据学习之路(九)——MapReduce实战(好友推荐 recommendation of friend)

项目介绍:给用户推荐好友,新好友来源你的好友关系网


描述有点抽象,举个栗子:

  A是你的好友,B是你的好友,C不是你的好友,但却是A和B的好友,系统推测你们可能是认识的人,于是将C当做你的新好友推荐给你。

数据(明星云集):

小明  老王  如花  林志玲
老王  小明  凤姐
如花  小明  李刚  凤姐
林志玲 小明  李刚  凤姐  郭美美
李刚  如花  凤姐  林志玲
郭美美 凤姐  林志玲
凤姐  如花  老王  林志玲 郭美美
介绍一下数据的意思,拿第一行为例

小明 老王 如花 林志玲
小明是用户, 老王、如花、林志玲,都是小明的好友

ok,知道了数据的意义,紧接着,我们思考一下,如何去用MapReduce去完成一个二次关系的计算。

1. 思路一

遍历小明的好友,再遍历小明好友的好友,从中找出不是小明好友的好友,拿到次数最多的推荐给小明。

2.思路二

根据小明的好友列表,我们先找到伪二次好友关系,就是说,对于小明这个人而言,他的好友老王 如花 林志玲互为二次伪好友,为什么说是伪二次好友呢?因为我们仅仅通过小明这一条关系,无法得知他们之前是否已经是真正的好友。

3.其他思路

balabala

很明显思虑二比较切合我们MapReduce的速算模型,因为我们可以逐行得到这些伪关系,接下来就是我们根据第一次的思路得到的数据期望值了。

首先,我们在map中,获取互为关系的人,设置伪二次关系的人的关系为1,已经是好友的人的关系为0。

小明  老王  如花  林志玲
=>
小明-老王    0
老王-如花    1
....

其次,我们根据ASSIC码将好友的名字进行排序,后合并。

小明-老王老王-小明 是相同的意义

然后,我们根据组合好后Key的ASSIC码再次进行排序,相同的分为一组,递交reduce。

最后,我们通过reduce,将关系为0的剔除,将其他各个关系之进行累加,最终得到我们的数据期望。

小明-凤姐   3
李刚-小明   2
林志玲-如花  3
老王-如花   2
老王-林志玲  2
郭美美-如花  1
郭美美-小明  1
郭美美-李刚  1
郭美美-老王  1

ok, 一个明了的二次关系图就出来了,接下来要做的事情就比较简单了,拆分成各个用户的互为关系,然后进行排序,输出二次关系最大的好友。也就是说:

小明-凤姐   3
==>
小明-凤姐   3
凤姐-小明   3

然后根据第一个用户的名字进行分组,根据二次好友度进行从大到小的排序。

最后,我们拿到二次关系最大的用户,入库推荐给用户。

凤姐-小明   3
如花-林志玲  3
小明-凤姐   3
李刚-小明   2
林志玲-如花  3
老王-如花   2
老王-林志玲  2
郭美美-如花  1
郭美美-小明  1
郭美美-李刚  1
郭美美-老王  1

代码我就不在这里贴出来了,大家可以直接去我的github上看源码,可以star一下方便跟踪^_^。

gitub [ https://github.com/qn9301/bigdata-learn/tree/master/hadoop/src/com/hadoop/learn/fof ]

猜你喜欢

转载自blog.csdn.net/qq_31343581/article/details/80874421