我希望从图表中实现一个算法,该图表为每个用户返回一个与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函数只需在以下文件中将mapper和reducer写入单独的文件中:
cat data.csv | python mapper.py | sort -k1,1 | python reducer.py
我是hadoop的新手,我的问题是应该写在mapper.py
和reducer.py
?
答案 0 :(得分:0)
我不确定你是否接受了一个没有明确使用MapReduce的答案,但我认为我提供了这个,因为它确实识别了二级关系,它是&#39 ;非常简单,并且可以扩展。
假设您正在运行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
表示关系的数量(即“跳跃”),因此如果您想要返回更远距离的连接,可以更改此项。