用過各種社交平台(如qq、微博、朋友網等等)的小夥伴應該都知道有乙個叫 "可能認識" 或者 "好友推薦" 的功能(如下圖)。它的演算法主要是根據你們之間的共同好友數進行推薦,當然也有其他如愛好、特長等等。共同好友的數量越多,表明你們可能認識,系統便會自動推薦。今天我將向大家介紹如何使用mapreduce計算共同好友假設有以下好友列表,a的好友有b,c,d,f,e,o; b的好友有a,c,e,k 以此類推
那我們要如何算出a-o使用者每個使用者之間的共同好友呢?
a:b,c,d,f,e,o
b:a,c,e,k
c:f,a,d,i
d:a,e,f,l
e:b,c,d,m,l
f:a,b,c,d,e,o,m
g:a,c,d,e,f
h:a,c,d,e,o
i:a,o
j:b,o
k:a,c,d
l:d,e,f
m:e,f,g
o:a,h,i,j
下面我們將演示分步計算,思路主要如下:先算出某個使用者是哪些使用者的共同好友,
如a是b,c,d,e等的共同好友。遍歷b,c,d,e兩兩配對如(b-c共同好友a,注意防止重複b-c,c-b)作為key放鬆給reduce端,
這樣reduce就會收到所有b-c的共同好友的集合。可能到這裡你還不太清楚怎麼回事,下面我給大家畫乙個圖。
由上可知,此次計算由兩步組成,因此需要兩個mapreduce程式先後執行第一步:通過mapreduce得到 某個使用者是哪些使用者的共同好友。
執行的到的結果如下:public class friendsdemosteponedriver }}
static class friendsdemosteponereducer extends reducer
context.write(key,new text(sb.tostring()));}}
public static void main(string args) throws ioexception, classnotfoundexception, interruptedexception
}
由圖可見:i,k,c,b,g,f,h,o,d都有好友a;a,f,j,e都有好友b。接下來我們只需組合這些擁有相同的好友的使用者,作為key傳送給reduce,由reduce端聚合d得到所有共同的好友
得到的結果如下:/**
* 遍歷有同個好友的使用者的列表進行組合,得到兩人的共同好友
*/public class friendsdemosteptwodriver }}
}static class frienddemosteptworeducer extends reducer
context.write(key,new text(sb.tostring()));}}
public static void main(string args) throws ioexception, classnotfoundexception, interruptedexception
}
如圖,我們就得到了擁有共同好友的使用者列表及其對應關係,在實際場景中再根據使用者關係(如是否已經是好友)進行過濾,在前端展示,就形成了我們所看到"可能認識"或者"好友推薦"啦~但是思路和方向基本一致,如果有更好的建議或演算法,歡迎與小吳一起討論喔~如果您喜歡這篇文章的話記得like,share,comment喔(^^)
MapReduce案例 好友推薦簡單實現
一 好友推薦演算法在實際的社交環境中應用較多,比如qq軟體中的 你可能認識的好友 或者是facebook中的好友推介。常見的好友推介演算法有六度分割理論,三元閉包論和最基本的好友推介演算法。學習和分享好友推介演算法。假設使用者a有好友a1,a2,a3,則a1,a2,a3相互之間都可能通過好友a認識,...
求共同好友案例 mapreduce實現
friends.txt a b,c,d,f,e,o b a,c,e,k c f,a,d,i d a,e,f,l需求 求每兩個人的共同好友 a和b,a和c a b,c,d,f,e,o b a,c,e,k 好友列表作為k b a c a d a a b c b e b 將matask端的value 本人...
MapReduce 共同好友
下面是a b c d e 5個人的好友情況 a b c d b a c d e c a b d e d a b c e e b c d 第一行的意思是a有bcd 3個好友,下面幾行的以此類推。請使用 map reduce 任務,完成共同好友這個功能。要求 1.描述清楚map和reduce函式的的輸入...