我正在尝试根据不使用Apache Spark的权重来计算大型网络中从给定源到给定目标的最短路径。由于我所有其他代码都是用python编写的,所以我不想更改。应该以某种方式可能,不是吗?由于我是Spark的新手,所以也许看不到如何解决问题。
也许有人可以帮助我吗?预先感谢!
到目前为止我尝试过的:
到目前为止还不错(不是真的)。 GraphFrames最短路径方法的问题在于,它计算从每个节点到给定节点集的最短路径,该路径适用于小型图,但对于大型网络却需要一定的时间。因为考虑了所有节点,所以完成了许多“不必要的”计算。我只需要获得从一个节点到另一节点的最短路径。
我正在互联网上搜索,发现Spark graphx库具有我正在寻找的功能,但可悲的是,它仅适用于Scala ...
也许我只是可以使用rdds根据权重计算最短路径?还是我找不到的pyspark的最短路径实现?无法相信pyspark没有实现最短路径算法。
vertices_rdd = vertices_rdd3.zipWithIndex()
# vertices_rdd.take(3):
# [((552897.813699282, 4164322.19502139), 0), ((583743.487097408, 4158379.86761575), 1), ((585964.589845657, 4158443.96863072), 2)]
edges_rdd = edges_rdd1.flatMap(lambda x: x)
# edges_rdd.take(3):
# [(62734, 107857, 102.19468251940246, '8'), (107857, 62734, 102.19468251940246, '8'), (79903, 191109, 21.81675476329727, '13')]
spark = SparkSession(sc)
vertices_df = vertices_rdd.toDF(["coordinate","id"])
edges_df = edges_rdd.toDF(["src", "dst", "distance", "streetclass"])
vertices_df.show()
#+--------------------+---+
#| coordinate| id|
#+--------------------+---+
#|[552897.813699282...| 0|
#|[583743.487097408...| 1|
#|[585964.589845657...| 2|
#|[588646.795215483...| 3|
#|[582405.137425844...| 4|
#|[582823.612980657...| 5|
#...
edges_df.show()
#+------+------+------------------+-----------+
#| src| dst| distance|streetclass|
#+------+------+------------------+-----------+
#| 62734|107857|102.19468251940246| 8|
#|107857| 62734|102.19468251940246| 8|
#| 79903|191109| 21.81675476329727| 13|
#|191109| 79903| 21.81675476329727| 13|
#| 60790| 66205|19.362434806339824| 13|
#...
from graphframes import *
g = GraphFrame(vertices_df, edges_df)
results = g.shortestPaths(landmarks=["0"])
results.select("id", "distances").show()
#+---+-----------+
#| id| distances|
#+---+-----------+
#| 0|Map(0 -> 0)|
#| 7|Map(0 -> 1)|
#| 6| Map()|
#| 9| Map()|
#| 5| Map()|
#| 1| Map()|
#| 3| Map()|
#| 8| Map()|
#...
回答为时已晚,但是如果有人在寻找该主题,可以使用此链接GraphFrames