当前位置: 首页 > 知识库问答 >
问题:

如何使用GraphX的Java API获取图形的连接组件的列表

贾实
2023-03-14

我对Spark和GraphX相当陌生,我正在尝试了解如何使用GraphX的Java API执行以下操作。我希望生成具有以下签名的方法

private <List<Graph<VD, ED>> computeConnectedComponents(Graph<VD, ED> graph){}

其中,给定一个只有正度节点的图,但连接分量未知,它应该返回一个图列表(顺序无关紧要),每个图都是连接的。

我知道 GraphOps.connectedComponents()ConnectedComponents.run(),但我正在努力理解返回值。文档将它们列为返回图形的图形

基本上,我想知道我能做些什么来从 connectedComponents 的返回值和我的初始图中派生这个图列表。


共有1个答案

宗政小林
2023-03-14

以下代码是用 scala 编写的,但应该演示这个想法。

返回的图形将包含所有顶点,但每个顶点的属性将替换为 VertexId(实际上只是一个 Long),它可以解释为顶点所属的连接组件的 id。它也是属于该连接组件的“最低顶点 id”。

import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
val vertexArray = Array(
  (1L, ("A", 28)),
  (2L, ("B", 27)),
  (3L, ("C", 65)),
  (4L, ("D", 42)),
  (5L, ("E", 55)),
  (6L, ("F", 50)),
  (7L, ("G", 53)),
  (8L, ("H", 66))
  )

// Vertices 1 - 6 are connected, 7 and 8 are connected.
val edgeArray = Array(
  Edge(2L, 1L, 7),
  Edge(2L, 4L, 2),
  Edge(3L, 2L, 4),
  Edge(3L, 6L, 3),
  Edge(4L, 1L, 1),
  Edge(5L, 2L, 2),
  Edge(5L, 3L, 8),
  Edge(5L, 6L, 3),
  Edge(7L, 8L, 3)
  )

val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)

val cc = graph.connectedComponents().vertices.collectAsMap()
cc.foreach {
  case (vertexId, clusterId) =>
    println(s"Vertex $vertexId belongs to cluster $clusterId")
}

输出:

Vertex 8 belongs to cluster 7
Vertex 2 belongs to cluster 1
Vertex 5 belongs to cluster 1
Vertex 4 belongs to cluster 1
Vertex 7 belongs to cluster 7
Vertex 1 belongs to cluster 1
Vertex 3 belongs to cluster 1
Vertex 6 belongs to cluster 1
 类似资料:
  • 问题内容: 我想要: 在pylab中返回当前图形列表的魔术函数是什么? 网络搜索没有帮助… 问题答案: 编辑:正如MattiPastell的解决方案所示,还有一个更好的方法:使用。

  • 问题内容: 我有一个API,它为我提供了Webpack处理的react组件,如下所示: 在react组件内部,我想获取此组件并显示它。到目前为止,这是我尝试过的方法,但不幸的是它没有用。api提取有效,但仅将组件显示为字符串。 我该如何在代码中的api获取的组件中使用它? 问题答案: 通过使用最新的Chrome,您可以执行以下操作: ProfilePage将是一个惰性组件。提取完成后将加载它。等待

  • 问题内容: 我正在制作一个基本的文件浏览器,并希望显示每个文件的图标。有什么办法可以做到这一点? 问题答案:

  • 问题内容: 我正在尝试在运行时使用代理创建URL连接。我的代码如下: 但这是行不通的。有人知道为什么吗? 问题答案: 添加答案以帮助将来的访客

  • 问题内容: 我正在尝试获取当前已连接的所有套接字/客户端的列表。 不幸的是,它不返回数组。 我知道我可以使用数组保留自己的列表,但是由于以下两个原因,这并不是最佳解决方案: 冗余。Socket.IO已保留此列表的副本。 Socket.IO提供了为客户端(即:)设置任意字段值的方法,因此,如果我要维护自己的列表,则需要跟上这些更改。 救命? 问题答案: 在Socket.IO 0.7中,您在名称空间上

  • 问题内容: 如何使用Java获取在同一网络(子网)中连接的IP的列表 问题答案: 当网络上的主机对ICMP软件包做出响应(ping)(> JDK 5)时,该方法应该起作用: 像这样调用子网(192.168.0.1-254)的方法: 没有测试它,但应该像这样工作。显然,这仅检查ip地址的最后一个字节中的254个主机… 校验: http://download-llnw.oracle.com/javas

  • 问题内容: 我一直在研究将要集成Git功能的基于Java的产品。使用Git的功能之一,我通过分阶段执行将10多个文件添加到Git存储库中,然后在一次提交中提交了这些文件。 以上过程可能相反吗?即查找作为提交的一部分提交的文件列表。 我在命令的帮助下获得了提交,但是我不确定如何获取提交的文件列表。 示例代码: 问题答案: 每个提交都指向一 棵树 ,该 树 表示构成该提交的所有文件。注意,这不仅包括使

  • 我一直在开发一个基于Java的产品,Git特性将被集成到该产品中。通过使用Git的一个特性,我将10个文件添加到Git存储库中,然后在一次提交中提交。 上述过程是否可能相反?即查找作为提交的一部分提交的文件列表。 我在< code>git.log()命令的帮助下获得了提交,但是我不确定如何获得提交的文件列表。 示例代码: