获取Apache Spark GraphX中与节点相连的所有节点

9
假设我们在Apache GraphX中获得的输入如下:
顶点RDD:
val vertexArray = Array(
  (1L, "Alice"),
  (2L, "Bob"),
  (3L, "Charlie"),
  (4L, "David"),
  (5L, "Ed"),
  (6L, "Fran")
)

边缘RDD:

val edgeArray = Array(
  Edge(1L, 2L, 1),
  Edge(2L, 3L, 1),
  Edge(3L, 4L, 1),
  Edge(5L, 6L, 1)
)

我需要所有与Apache Spark GraphX节点连接的组件。
1,[1,2,3,4]
5,[5,6]

好的,我们明白您需要什么。您尝试过什么?还是您期望 Stack Overflow 为您编写代码? - The Archetypal Paul
我只需要基本的概述,不需要代码。至于问题是否需要写出我尝试过的内容,我认为这会让问题变得混乱而且不够简洁明了。我已经查看了Spark GraphX的参考资料,但是没有找到解决方案。 - Ajay Gupta
此外,还有collectNeighbours函数,它似乎可以做到你需要的功能:http://spark.apache.org/docs/latest/graphx-programming-guide.html#collecting-neighbors - dmitry
collectNeighbors将提供节点->相邻节点列表的信息,而collectNeighborsId仅提供节点的ID,因此无法帮助我获取所有连接的组件。 - Ajay Gupta
collectNeighbors 的输出:4 -> (3,Charlie),1 -> (2,Bob),6 -> (5,Ed),3 -> (2,Bob),(4,David),5 -> (6,Fran),2 -> (1,Alice),(3,Charlie)。 - Ajay Gupta
您可以通过操作顶点和边的RDDS来实现目标,计划如下:将顶点和边RDD根据顶点ID连接,然后映射到其他顶点ID,最后按键分组。由于您将图形视为非定向图形,因此可能需要进行其他操作,例如在连接之前,您需要将原始边缘与反转边缘联合(顺便说一句,您可以这样做并使用“collectNeighbours”)。 - dmitry
1个回答

11
你可以使用ConnectedComponents,它会返回一个包含最小顶点ID的连通组件的顶点值的图形。然后可以重新整理结果。
graph.connectedComponents.vertices.map(_.swap).groupByKey

如果图形是6->5,4->3->3->1,那么这将产生错误的结果,我认为。它仍然会产生相同的结果,而应该是(6,[5,6],4,[1,2,3,4])? - The Archetypal Paul
这些不是强连通分量,标签的选择是任意的。使用最低的id是有意义的,所以我认为这里没有问题。 - zero323
如果标签是任意的,那么是的,同意。如果 OP 想要子图的起始点,那么就有问题了。但只有 OP 自己知道这一点。 - The Archetypal Paul
连通分量将找到子图,其中每个顶点都有路径到每个其他顶点。实际上,如果它是强连通的,则可能是整个初始图。 - dmitry
你没有回答他的问题。 - gtzinos
如何在Java中实现这个? - shogitai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接