Apache spark 关于Graphx三角形计数中规范方向的查询
我已经阅读了许多文章以及Spark自己的文档,其中说Graphx三角形计数要求图形具有规范定向。关于规范定向,它被描述为边缘源id<目标id 在图中有以下三条边Apache spark 关于Graphx三角形计数中规范方向的查询,apache-spark,spark-graphx,Apache Spark,Spark Graphx,我已经阅读了许多文章以及Spark自己的文档,其中说Graphx三角形计数要求图形具有规范定向。关于规范定向,它被描述为边缘源id
edges.add(new Edge<String>(1, 2, "Friend"));
edges.add(new Edge<String>(2, 3, "Advisor"));
edges.add(new Edge<String>(1, 3, "Friend"));
添加(新的边缘(1,2,“朋友”);
添加(新边缘(2,3,“顾问”);
添加(新边(1,3,“朋友”);
它显示节点1、2、3有一个三角形与其关联,这是有意义的。但是,即使按如下所示更改边的方向,结果仍然相同
edges.add(new Edge<String>(2, 1, "Friend"));
edges.add(new Edge<String>(3, 2, "Advisor"));
edges.add(new Edge<String>(3, 1, "Friend"));
添加(新的边缘(2,1,“朋友”);
添加(新边缘(3,2,“顾问”);
添加(新的边缘(3,1,“朋友”);
这让我感到困惑,因为在这种情况下,edge的source\u id大于dest\u id。有人能解释一下这个概念吗?这取决于您如何在GraphX中执行三角形计数算法。如果您只是调用
triangelecount.run
,那么GraphX将为您规范化图形,更具体地说,.run
方法如下所示:
def run[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED]): Graph[Int, ED] = {
// Transform the edge data something cheap to shuffle and then canonicalize
val canonicalGraph = graph.mapEdges(e => true).removeSelfEdges().convertToCanonicalEdges()
// Get the triangle counts
val counters = runPreCanonicalized(canonicalGraph).vertices
// Join them bath with the original graph
graph.outerJoinVertices(counters) { (vid, _, optCounter: Option[Int]) =>
optCounter.getOrElse(0)
}
}
请注意,run方法计算图形的规范方向,然后运行。此外,即使您调用了graph.triangelecount()
,此方法也只是从上面调用triangelecount.run
:
def triangleCount(): Graph[Int, ED] = {
TriangleCount.run(graph)
}
我相信这就是为什么无论您以何种方式定位边缘,代码都会返回相同的值。至于GraphX为什么需要规范定向,我不太清楚。我可以想到两个原因:
runPreCanonicalized
函数中的edgeFunc
假设/要求边是规范的.run
方法可能很昂贵。该文档明确指出,“规范化过程成本高昂,因为它需要重新划分图形。如果输入数据已处于“规范形式”,且自循环已被删除,则应使用triangelecount.runPreCanonicalized
。”
我希望这会有帮助:)这真的很有帮助