reduce的python算法图

ruyhziif  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(521)

我想从一个图中实现一个算法,该图为每个用户返回一个用户列表,其中他与一个度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 ?

5q4ezhmt

5q4ezhmt1#

我不确定你是否会接受一个没有显式使用mapreduce的答案,但我认为我会提供这个,因为它确实确定了二级关系,它非常简单,而且可以扩展。
假设您有一个运行的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”),可以运行如下cypher查询:

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"}   |
+-------------------------+

这个 *2 在cypher中,查询表示远离的关系(即“hops”)的数量,因此如果希望返回更遥远的连接,可以更改此值。

相关问题