2016-06-09 5 views
2

graphframes ist ein Netzwerkanalyse-Tool, das auf PySpark DataFrames basiert. Der folgende Code ist eine modifizierte Version des Tutorials subgraphing Beispiels:Die richtige Unterteilung eines PySpark GraphFrame

from graphframes.examples import Graphs 
import graphframes 
g = Graphs(sqlContext).friends() # Get example graph 
# Select subgraph of users older than 30 
v2 = g.vertices.filter("age > 30") 
g2 = graphframes.GraphFrame(v2, g.edges) 

man erwarten würde, dass das neue Diagramm wird g2 weniger Knoten und weniger Kanten enthalten, im Vergleich zu dem ursprünglichen, g. Dies ist jedoch nicht der Fall:

print(g.vertices.count(), g.edges.count()) 
print(g2.vertices.count(), g2.edges.count()) 

den Ausgang gibt:

(6, 7) 
(7, 4) 

Es ist offensichtlich, dass die resultierende Graph enthält Kanten für nicht vorhandenen Knoten. Noch störender ist die Tatsache, dass g.degrees und g2.degrees identisch sind. Dies bedeutet, dass mindestens einige der Diagrammfunktionen die Knoteninformationen ignorieren. Gibt es eine gute Möglichkeit, um sicherzustellen, dass GraphFrame erstellt ein Diagramm mit nur der Schnittmenge der gelieferten nodes und edges Argumente?

Antwort

1

Interessante .. Ich bin nicht in der Lage, dieses Ergebnis zu sehen:

>>> from graphframes.examples import Graphs 
>>> import graphframes 
>>> g = Graphs(sqlContext).friends() # Get example graph 
>>> # Select subgraph of users older than 30 
... v2 = g.vertices.filter("age > 30") 
>>> g2 = graphframes.GraphFrame(v2, g.edges) 
>>> print(g.vertices.count(), g.edges.count()) 
(6, 7) 
>>> print(g2.vertices.count(), g2.edges.count()) 
(4, 7) 

GraphFrames ab sofort überprüft nicht, ob der Graph gültig ist - das heißt. Alle Kanten sind Verbindungen zu Scheitelpunkten und so weiter, zur Konstruktionszeit des Diagramms. Aber scheint die Anzahl der Scheitelpunkte nach dem Filter korrekt zu sein?

+0

> Aber scheint die Anzahl der Scheitelpunkte nach dem Filter korrekt zu sein? Es ist, aber nicht die Anzahl der Kanten. Durch das Entfernen von Scheitelpunkten sollten auch einige Kanten entfernt werden –

1

Ein Verfahren, das ich ein graphframe Subgraphen verwenden ist mit Motiven:

motifs = g.find("(a)-[e]->(b)").filter(<conditions for a,b or e>) 
new_vertices = sqlContext.createDataFrame(motifs.map(lambda row: row.a).union(motifs.map(lambda row: row.b)).distinct()) 
new_edges = sqlContext.createDataFrame(motifs.map(lambda row:row.e).distinct()) 
new_graph = GraphFrame(new_vertices,new_edges) 

Während dies komplizierter aussieht und möglicherweise dauert länger in Bezug auf die Laufzeit, für kompliziertere Graphen-Abfragen, dies dient auch Sie interagieren mit dem Graphen als einzelne Einheit und nicht als getrennte Ecken und Kanten. So beeinflusst das Filtern von Scheitelpunkten auch Kanten, die im Graphframe verbleiben.