带有地图缩减的算法图

时间:2015-07-04 14:56:08

标签: python hadoop

我希望从图表中实现一个算法,该图表为每个用户返回一个与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.pyreducer.py

1 个答案:

答案 0 :(得分:0)

我不确定你是否接受了一个没有明确使用MapReduce的答案,但我认为我提供了这个,因为它确实识别了二级关系,它是&#39 ;非常简单,并且可以扩展。

假设您正在运行Neo4j数据库,您可以创建图表:

graph of relationships

...运行此代码:

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表示关系的数量(即“跳跃”),因此如果您想要返回更远距离的连接,可以更改此项。