利用Hadoop實現求共同好友的示例詳解

2022-09-26 19:00:26 字數 2677 閱讀 3923

目錄

這種功能該如何實現呢?對redis比較了解的同學應該能很快想到,可以使用redis來實現這個功能。沒錯,redis確實是個不錯的可以實現這個功能的方案。

但redis的實現有一定的侷限性,因為redis儲存和資料和計算時需要耗費較多的記憶體資源,設想一下,像騰訊qq這樣的規模,如果用這種方式做的話,估計redis伺服器的投入成本將是一筆不小的開銷。

利用hadoop中的mapreduce同樣可以實現這個功能,該如何實現呢?

下面是原始的資料檔案,第一欄可理解為本人,第二行為該使用者的好友列表,以逗號分割,比如a使用者的好友包括:b,c,d,f,e,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,e

a-c    f,d

a-d    e,f

......

步驟一:將原始資料拆分為如下格式

通過這一步,得到一組k/v,可以清晰的反映出乙個使用者的所有好友

b:a            #b是a的好友

c:a            #c是a的好友

d:a            #d是a的好友

f:ae:a

o:aa:b

c:be:b

k:bf:c

a:cd:c

i:cb:e

c:ed:e

m:el:e

步驟二、對第一步的資料進一步處理成如下格式

從第一步格式完畢後的資料,可以很明顯看出並總結出乙個規律,那就是左邊那些使用者的好友列表,以c使用者為例,可以看出c這個使用者有a,b,e三個好友,反過來講,abeycjjnk這三個使用者,他們有乙個共同的好友a

其他的類推進行理解

c  a-b-e  #c是a和b和e的共同好友

d  a-c      #d是a和b的共同好友

a  b-c      #a是b和c的共同好友

b  a-e    #a是e和b的共同好友

......

步驟三、將步驟二中的資料調換位置

從步驟2中我們得知,c的好友有abe,反過來說,abe他們的共同好友有c,針對這種超過3個的,可以考慮下一步進行兩兩組合即可

a-b-e   c     #a、b、e有共同好友c

a-c     d     #a與c有共同好友d

b-c     a     #b與c有共同好友a

a-e     b     #a與e有共同好友b

步驟四、將步驟三得到的資料繼續拆分

步驟三中,像 : a-b-e c 這種資料,顯然需要進一步拆分,因為最終的結果是求取兩兩好友之間的共同好友,所以可以拆為: a-b c,a-e c,b-e c,為下一步資料組合做最後的準備

a-b  c

a-e  c

b-e  c

a-c  d

b-c  a

a-e  b

......

步驟五、將步驟四得到的資料合併

在使用mapreduce程式設計中我們知道,map階段出去的資料,進入reduce方法中的資料都是key相同的,以第四步中的: a-e 這個key為例,就有2個,這樣通過 reduce方法最終輸出的結果就是: a-e c,b ,即a-e 這兩個使用者的共同好友為 c和b

a-b  c        #a,b共同好友有c

a-e  c,b      #a,e有共同好友 c,b

b-e  c        #b,e有共同好友 c

a-c  d        #a,c有共同好友 d

b-c  a        #b,c有共同好友 a

......

通過以上的資料分析,最終可以達到預期的效果,同時也可以看出,上面的步驟劃分到mapredcue中,顯然乙個mapreduce肯定是無法完成的,至少需要2個

下面是結合上面的步驟分析,得出需要兩個mapreduce的資料流程圖,參考這個圖來協助我們分析編寫**邏輯做參考

public class firstmapper extends mapper

}}public class firstreducer extends reducer

//最終寫出去的資料格式為: a-e b ......

context.write(new text(stringbuffer.tostring()),key);

}}public class firstjob

}執行上面的job**,然後開啟執行完畢後的第乙個階段的檔案,從內容格式上看,符合第一階段的輸出結果要求的, 即下面的這種資料格式

public class secondmapper extends mapper

context.write(key,new text(stringbuffer.tostring()));

}}public class secondjob

}執行上面的job**,檢視最終的輸出結果,可以看到,也是符合我們預期的業務的

hadoop求共同好友案例

4.1 需求分析 以下是qq的好友列表資料,冒號前是乙個使用者,冒號後是該使用者的所有好友 資料中的好友關係是單向的 a b,c,d,f,e,o b a,c,e,k c a,b,d,e,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...

mysql共同好友 Spark 實現共同好友

核心 如下 object sprk import org.apache.spark.sql.sparksession def main args array string unit logger.getlogger org setlevel level.off logger.getlogger ak...

求共同好友案例 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 本人...