在程式的實現上,其實我們要找的是:若 user1 follow了10個人 {user3,user4,user5,... ,user12}記為集合uf1,那麼 uf1中的這些人,他們也有follow的集合,分別是記為: uf3(user3 follow的人),uf4,uf5,...,uf12;而在這些集合肯定會有交集,而由最多集合求交產生的交集,就是我們要找的:感興趣的人。
我在網上找了些,關於二度人脈演算法的實現,大部分無非是通過廣度搜尋演算法來查詢,由於深度已經明確了2以內;這個演算法其實很簡單,第一步找到你關注的人;第二步找到這些人關注的人,最後找出第二步結果中出現頻率最高的乙個或多個人,即完成。
但如果有千萬級別的使用者,那在運算時,就肯定會把這些使用者的follow 關係放到記憶體中,計算的時候依次查詢;先說明下我沒有明確的診斷對比,這樣做的效果不一定就不如 基於hadoop實現的好;只是自己,想用hadoop實現下,最近也在學;若有不足的地方還請指點。
首先,我的初始資料是檔案,每一行為乙個follow 關係 ida+『\t』+idb;表示 ida follow idb。其次,用了2個map/reduce任務。
map/reduce 1:找出 任意乙個使用者 的 follow 集合與 被 follow 的集合。如圖所示:
**如下:
map任務: 輸出時 key :間接者 a 的id ,value:follow 的人的id 或 被follow的人的id
01
public
void
map(text key, intwritable values, context context)
throws
ioexception,interruptedexception
12
}
reduce任務: 輸出時
key :間接者 a 的id , value為 兩個string,第乙個而follow的所有人(用分割符分割),第二個為 被follow的人(同樣分割)
01
protected
void
reduce(text key, iterablepairs, context context)
02
throws
ioexception,interruptedexception
else
if
(id.startswith(
"b"
))
14
}
15
16
context.write(key,
new
textpair(first_follow.tostring(),second_befollow.tostring()));
17
}
其中separator.table_string為自定義的分隔符;textpair為自定義的 writable 類,讓乙個key可以對應兩個value,且這兩個value可區分。
map/reduce 2:在上一步關係中,若b follow a,而 a follow t ,則可以得出 t 為 b 的二度人脈,且 間接者為a ,於是找出 相同二度人脈的不同間接人。如圖所示:
**如下:
map 任務:輸出時 key 為 由兩個string 記錄的id表示的 二度人脈關係,value 為 這個二度關係產生的間接人的id
01
public
void
map(text key, textpair values, context context)
throws
ioexception,interruptedexception
15
}
16
}
17
}
reduce任務:輸出時 key 仍然為二度人脈關係, value 為所有間接人 的id以逗號分割。
01
protected
void
reduce(textpair key, iterablevalues, context context)
02
throws
ioexception, interruptedexception
08
09
context.write(key,
new
text(resutl.tostring()));
10
}
到這步,二度人脈關係基本已經挖掘出來,後續的處理就很簡單了,當然也可以基於二度人脈挖掘三度,四度:)
依據二度人脈推薦好友sql
friend表結構 drop table if exists friend create table friend uid bigint not null comment 使用者標識 friend uid bigint not null comment 申 為好友的使用者標識 sys create ...
Hadoop例項 二度人脈與好友推薦
頂點a b c到i分別是社交 的使用者,兩頂點之間的邊表示兩頂點代表的使用者之間相互關注。那麼如何根據使用者之間相互關注所構成的圖,來向每個使用者推薦好友呢?可能大家都聽說過六度人脈的說法,所謂六度人脈是指 地球上所有的人都可以通過五層以內的熟人鏈和任何其他人聯絡起來。通俗地講 你和任何乙個陌生人之...
Hadoop例項 二度人脈與好友推薦
其實,社交 上的各個使用者以及使用者之間的相互關注可以抽象為乙個圖。以下圖為例 頂點a b c到i分別是社交 的使用者,兩頂點之間的邊表示兩頂點代表的使用者之間相互關注。那麼如何根據使用者之間相互關注所構成的圖,來向每個使用者推薦好友呢?可能大家都聽說過六度人脈的說法,所謂六度人脈是指 地球上所有的...