2016-05-05 4 views
2

Ich habe einen Datenrahmen dfMaster, der drei Spalten hat, Vertex1, Vertex2, Gewicht. Ich versuche einen GraphX ​​gerichteten gewichteten Graphen zu erstellen, der Scheitelpunkte von V1 und V2 und Kanten zwischen ihnen mit ihrem entsprechenden Gewicht hat. Ich kann den Rand und Vertex df des erstellen, indem Sie:Spark Scala GraphX: Erstellen eines gewichteten gerichteten Graphen

val edgeDF = dfMaster.select($"vertex1", $"vertex2", $"weight").distinct() 
val vertexDF = (dfMaster.select("vertex1").toDF().unionAll(DFMaster.select("vertex2").toDF())).distinct() 

Wie kann ich das dann in einen gewichteten Graphen laden? Danke für die Hilfe.

Antwort

3

Soweit ich weiß, unterstützt Spark GraphX ​​derzeit nur die Erstellung von RDDs.

Für Ihren Fall schlage ich den folgenden Code: Die wichtigsten Methoden für die Diagrammerstellung können auf den folgenden Klassen finden

import org.apache.spark.sql.Row 
import org.apache.spark.graphx.{Graph, Edge} 

val edgeDF = dfMaster.select($"vertex1", $"vertex2", $"weight").distinct() 

val edgeRDD = edgeDF.map { 
    case Row(srcId: Double, dstId: Double, wgt: Double) => Edge[Double](srcId.toLong, dstId.toLong, wgt) 
} 

val graph = Graph.fromEdges[Int, Double](edgesRDD, 0) 

Die fromEdges Methode oben leitet die Scheitelpunkte von den Kanten ab und setzt 0 als ihr Attribut.

Annahmen:

  • vertex1, vertex2 und weight sind Spalten von Double;
  • Es gibt keine Attributinformationen für Scheitelpunkte, daher ist es in Ordnung, wenn alle mit 0 erstellt werden.
+0

Hey danke für die Hilfe. Die Typen von Vertex1, Vertex2 und Vertex3 sind allesamt Doubles. Ich ging voran und änderte Ihren Code und änderte es in Doppel. Wenn ich jedoch die edgeRDD-Zeile ausgeführt habe, erhalte ich drei Fehler bei Edge [Double] (srcId, dstId, wgt) mit der Fehlermeldung: type mismatch, found Double, erforderlich org.apache.spark.graphx.VertexId. Weißt du was das bedeutet? – mt88

+0

Die Scheitelpunkt-IDs müssen vom Typ Long sein (oder VertexId, das ein Untertyp von Long ist) –

+0

Ich habe den Code für Double-typed data geändert –