Apache spark 关于Graphx三角形计数中规范方向的查询

Apache spark 关于Graphx三角形计数中规范方向的查询,apache-spark,spark-graphx,Apache Spark,Spark Graphx,我已经阅读了许多文章以及Spark自己的文档,其中说Graphx三角形计数要求图形具有规范定向。关于规范定向,它被描述为边缘源id

我已经阅读了许多文章以及Spark自己的文档,其中说Graphx三角形计数要求图形具有规范定向。关于规范定向,它被描述为边缘源id<目标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
    。”


    我希望这会有帮助:)

    这真的很有帮助