首页 > 解决方案 > 删除 GraphX 中没有出边的顶点

问题描述

我有一个大图(几百万个顶点和边)。我想删除所有没有出边的顶点(和边)。我有一些有效的代码,但速度很慢,我需要做几次。我确信我可以使用一些现有的 GraphX 方法来使其更快。

这是我的代码。

val users: RDD[(VertexId, String)] = sc.parallelize(Array((1L, "1"), (2L, "2"), (3L, "3"), (4L, "4")))
  val relationships: RDD[Edge[Double]] = sc.parallelize(
    Array(
      Edge(1L, 3L, 500.0),
      Edge(3L, 2L, 400.0),
      Edge(2L, 1L, 600.0),
      Edge(3L, 1L, 200.0),
      Edge(2L, 4L, 200.0),
      Edge(3L, 4L, 500.0)
    ))

val graph = org.apache.spark.graphx.Graph(users, relationships)

val lst = graph.outDegrees.map(x => x._1).collect
var set:scala.collection.mutable.HashSet[Long] = new scala.collection.mutable.HashSet()
for(a<- lst) {set.add(a)}
var subg = graph.subgraph(vpred = (id, attr) => set.contains(id))
//since vertex 4 has no outgoing edges, subg.edges should return 4 and subg.vertices = 3 

我不知道这还能如何实现。任何帮助表示赞赏!

编辑:我可以用 HashSet 做到这一点,但我认为它仍然可以改进。

标签: scalaapache-sparkspark-graphx

解决方案


您可以使用过滤的顶点直接定义另一个图。像这样的东西:

val lst = graph.outDegrees.map(x => x._1).collect
var graph2 = Graph(graph.vertices.filter(v => lst.contains(v)), graph.edges)

推荐阅读