我在Spark GraphX(Scala)中有一个有向图G.我想找到应该从已知顶点v1
开始到达另一个顶点v2
的边数。换句话说,我需要从顶点v1
到顶点v2
的最短路径,这些路径以边数计算(不使用边的权重)。
我正在查看GraphX documentation,但我无法找到方法来执行此操作。如果图形具有树结构,则还需要这样来计算图形的深度。他们是一个简单的方法吗?
答案 0 :(得分:5)
要使用Spark GraphX找到顶点之间的最短路径,可以使用ShortestPaths对象,它是org.apache.spark.graphx.lib的成员。
假设您在g
中有一个GraphX图表,并且想要找到包含ID v1
和v2
的顶点之间的最短路径,则可以执行以下操作:
import org.apache.spark.graphx._
import org.apache.spark.graphx.lib.ShortestPaths
val result = ShortestPaths.run(g, Seq(v2))
val shortestPath = result // result is a graph
.vertices // we get the vertices RDD
.filter({case(vId, _) => vId == v1}) // we filter to get only the shortest path from v1
.first // there's only one value
._2 // the result is a tuple (v1, Map)
.get(v2) // we get its shortest path to v2 as an Option object
ShortestPaths GraphX算法返回一个图形,其中顶点RDD包含格式为(vertexId, Map(target -> shortestPath)
的元组。此图将包含原始图的所有顶点,以及它们在算法的Seq
参数中传递的所有目标顶点的最短路径。
在你的情况下,你想要两个特定顶点之间的最短路径,所以在上面的代码中我展示了如何只用一个目标(v2
)调用算法,然后我过滤结果只得到从所需顶点(v1
)开始的最短路径。