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