我正在GraphX上实现一种算法,为此我还需要计算一些相对较小的图的直径。 问题在于GraphX没有任何无向图的概念,因此当使用ShortestPaths中的内置方法时,它显然会获取简化的有向路径。这对计算图形直径(任何一对节点之间的最长短路无向路径)没有太大帮助。
我想复制图形的边缘(而不是| E |而是2 | E |边缘),但是我不认为这是正确的方法。那么,有没有一种更好的方法可以在GraphX上做到这一点呢?
这是我的有向图代码:
// computing the query diameter
def getDiameter(graph: Graph[String, Int]):Long = {
// Get ids of vertices of the graph
val vIds = graph.vertices.collect.toList.map(_._1)
// Compute list of shortest paths for every vertex in the graph
val shortestPaths = lib.ShortestPaths.run(graph, vIds).vertices.collect
// extract only the distance values from a list of tuples <VertexId, Map> where map contains <key, value>: <dst vertex, shortest directed distance>
val values = shortestPaths.map(element => element._2).map(element => element.values)
// diamter is the longest shortest undirected distance between any pair of nodes in te graph
val diameter = values.map(m => m.max).max
diameter
}
答案 0 :(得分:1)
GraphX实际上没有方向性的概念,您不会告诉它使用它。
如果查看ShortestPaths
库的内部工作原理,您会发现它使用Pregel
并且方向为默认(EdgeDirection.Either
)。这意味着对于所有三元组,它将源和目标都添加到活动集中。
但是,如果您在sendMsg
的{{1}}函数中指定仅将srcId保留在活动集中(如Pregel
lib中那样),则某些顶点(仅具有向外的边)将不会重新评估。
无论如何,一种解决方案是编写自己的Diameter对象/库,也许看起来像这样(很大程度上基于ShortestPaths
,所以也许还有更好的解决方案?)
ShortestPath