Модификация не rdd объекта с помощью функций pyspark - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь найти связанные компоненты в графе через 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, {})

Если кто-нибудь знает, в чем заключаются ошибки или как мне поступить, я был бы очень благодарен.

...