2015-07-04 63 views
0

我期待實現從與他與學位X.算法圖地圖降低

該圖是由包含在文件中表示連接返回每個用戶的用戶的列表的圖形算法每行用戶連接(連接在2方向)。

例如:

davidbowie omid 
davidbowie kim 
kim torsten 
torsten omid 
brendan torsten 
ziggy davidbowie 
mick ziggy 

這裏1度,必須有以下輸出:

torsten brendan kim omid 
brendan torsten 
ziggy davidbowie mick 
mick ziggy 
kim davidbowie torsten 
omid davidbowie torsten 
davidbowie kim omid ziggy 

每一行包含一個用戶和與他被連接到1度用戶列表。

運行與Python MapReduce的功能只寫後在單獨的文件映射器和減速機:

cat data.csv | python mapper.py | sort -k1,1 | python reducer.py 

我用Hadoop是一個新手,我的問題是什麼應該mapper.pyreducer.py寫?

+0

數據集有多大?它看起來很適合圖形數據庫(例如Neo4j,OrientDB等),而不是編寫自己的mapreduce作業。如果這對你很重要,有Python API。 –

回答

0

我不確定你是否願意接受一個沒有明確使用MapReduce的答案,但我認爲我會提供這個答案,因爲它可以確定二度關係,這很簡單,並且可以擴展。通過運行此代碼

graph of relationships

...:

假設你有一個Neo4j的數據庫運行,可以創建圖形

from py2neo import Graph 

people_pair_text = """\ 
davidbowie omid 
davidbowie kim 
kim torsten 
torsten omid 
brendan torsten 
ziggy davidbowie 
mick ziggy""" 

people = set(people_pair_text.split()) 

graph = Graph() 

for person in people: 
    query = """CREATE (n:Person {{ name : '{0}'}})""".format(person) 
    graph.cypher.execute(query) 

for pair in people_pair_text.split("\n"): 
    person_a, person_b = pair.split() 
    query = """ 
    MATCH (a:Person),(b:Person) 
    WHERE a.name = '{0}' AND b.name = '{1}' 
    CREATE (a)-[:KNOWS]->(b) 
    CREATE (b)-[:KNOWS]->(a) 
    """.format(person_a, person_b) 
    graph.cypher.execute(query) 

然後,要獲得第二學位的連接一個給定的用戶(例如'omid'),你可以運行這樣的密碼查詢:

MATCH (omid:Person {name:"omid"})-[:KNOWS*2]-some_connection 
WHERE some_connection <> omid 
RETURN DISTINCT some_connection 

查詢返回:

+-------------------------+ 
| some_connection   | 
+-------------------------+ 
| Node[1]{name:"brendan"} | 
| Node[4]{name:"kim"}  | 
| Node[2]{name:"ziggy"} | 
+-------------------------+ 

在Cypher支架查詢中的*2表示關係的數目(即'hops'),所以如果你想返回更遠的連接,你可以改變它。