У меня есть большой граф (несколько миллионов вершин и ребер).Я хочу удалить все вершины (и ребра), у которых нет исходящих ребер.У меня есть код, который работает, но он медленный, и мне нужно сделать это несколько раз.Я уверен, что могу использовать какой-нибудь существующий метод 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, но я думаю, что это все еще можно улучшить.