2016-06-18 10 views
3

Ich versuche, die effizienteste Art und Weise nehmen Sie die Karte ausgegeben von der GraphFrames Funktion shortestPaths zu finden und jeder Vertex-Distanzen Karte in einzelne Zeilen in einem neuen Datenrahmen zu glätten. Ich habe in der Lage gewesen, es sehr ungeschickt zu tun, indem die Abstände Spalte in ein Wörterbuch ziehen und wandeln dann von dort in eine Pandas Datenrahmen und dann zurück zu einer Spark-Datenrahmen konvertieren, aber ich weiß, es muss einen besseren Weg geben.Convert GraphFrames ShortestPath Karte in Datenrahmen Reihen in PySpark

from graphframes import * 

v = sqlContext.createDataFrame([ 
    ("a", "Alice", 34), 
    ("b", "Bob", 36), 
    ("c", "Charlie", 30), 
], ["id", "name", "age"]) 

# Create an Edge DataFrame with "src" and "dst" columns 
e = sqlContext.createDataFrame([ 
    ("a", "b", "friend"), 
    ("b", "c", "follow"), 
    ("c", "b", "follow"), 
], ["src", "dst", "relationship"]) 

# Create a GraphFrame 
g = GraphFrame(v, e) 

results = g.shortestPaths(landmarks=["a", "b","c"]) 
results.select("id","distances").show() 

+---+--------------------+ 
| id|   distances| 
+---+--------------------+ 
| a|Map(a -> 0, b -> ...| 
| b| Map(b -> 0, c -> 1)| 
| c| Map(c -> 0, b -> 1)| 
+---+--------------------+ 

Was ich will, ist die Ausgabe über nehmen und die Abstände abflachen, während die IDs in etwa wie folgt zu halten:

+---+---+---------+  
| id| v | distance| 
+---+---+---------+ 
| a| a | 0  | 
| a| b | 1  | 
| a| c | 2  | 
| b| b | 0  | 
| b| c | 1  | 
| c| c | 0  | 
| c| b | 1  | 
+---+---+---------+ 

Dank.

Antwort

2

können Sie explodieren:

>>> from pyspark.sql.functions import explode 
>>> results.select("id", explode("distances"))