使用pyspark函数修改非rdd对象

时间:2019-02-17 18:19:02

标签: python apache-spark parallel-processing pyspark rdd

我正在尝试通过Pyspark在图中找到连接的组件。首先,我用Python定义了自己的图类,并具有诸如addEdge,get_vertices等典型属性。

class Graph:

    def __init__(self):
        self.graph = defaultdict(set) # default dictionary to store graph

    def get_vertices(self):
        return(set(self.graph.keys()))

    # function to add an edge to graph
    def addEdge(self,u,v, bidirection = True):
        self.graph[u] |= {v}
        if bidirection:
            self.graph[v] |= {u} #bidirectional
        return self

我不确定人们通常是否会这样工作,但是作为第一步,我决定采用这些边并将其添加到我的图形对象中。为此,我做了类似的事情:

from folder.file import Graph, Tree

data = [(0,1), (1,2),(2,5),(5,8),(7,8),(3,7),(3,4),(3,6)]
rdd = spark.sparkContext.parallelize(graph)
G = Graph()

result = rdd.map(lambda x: G.addEdge(x[0],x[1]))
result.collect()
G.get_vertices()

但是,这似乎不起作用,因为Pyspark似乎复制了G,因此地图实际上在该副本上运行。

#G.get_vertices()
defaultdict(set, {})

如果有人知道什么是错误或我应该怎么做,我将非常感激。

0 个答案:

没有答案