我正在尝试根据 Apache Spark 的权重计算大型网络中从给定源到给定目标的最短路径。因为我所有的其他代码都是用 python 编写的,所以我不想改变。这应该是可能的,不是吗?由于我对 Spark 很陌生,也许我不知道如何解决这个问题。
也许有人可以帮助我?提前致谢!
到目前为止我尝试了什么:
- 创建顶点和边列表
- 使用 GraphFrame() 创建图形
- 取消 GraphFrames 最短路径方法来计算最短路径
到目前为止一切都很好(不是真的)。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()|
#...