2016-06-18 2 views
3

Я пытаюсь найти наиболее эффективный способ вывода Map из функции ShortFrams функции GraphFrames и сгладить карту расстояний каждой вершины в отдельные строки в новом DataFrame. Я смог сделать это очень неуклюже, потянув столбец расстояний в словарь, а затем конвертировался оттуда в кадр данных pandas, а затем перешел обратно в фреймворк Spark, но я знаю, что должен быть лучший способ.Преобразование GraphFrames ShortestPath Map в строки DataFrame в 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)| 
+---+--------------------+ 

То, что я хочу взять выход выше и сглаживать расстояния, сохраняя при этом идентификаторы во что-то вроде этого:

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

Спасибо.

ответ

2

Вы можете взорваться:

>>> from pyspark.sql.functions import explode 
>>> results.select("id", explode("distances")) 
Смежные вопросы