scala - 删除 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 做到这一点,但我认为它仍然可以改进。
解决方案
您可以使用过滤的顶点直接定义另一个图。像这样的东西:
val lst = graph.outDegrees.map(x => x._1).collect
var graph2 = Graph(graph.vertices.filter(v => lst.contains(v)), graph.edges)
推荐阅读
- angularjs - 在 AngularJS 测验中计算正确答案并显示总分
- reactjs - Firebase + Next.js 无服务器,在 GCP 上 - 如何管理登台、生产 + 本地
- vb.net - 如何获取 DataGridViewComboBoxCell 项目并将它们添加到 vb.net 中的 excel 数据验证列表
- reactjs - 重定向到主页或任何页面
- swift - 如何实现谷歌登录
- time - 必须每 15 分钟运行一次但不是在 15、30、45 运行的 cron 作业的问题
- python - 使用 panda 或 numpy 从一个 csv 加载多个数据帧
- django - 您不能更改 m2m 字段或从 m2m 字段更改或通过 =onmn2m 字段添加或删除
- python - docker 安装依赖失败
- powershell - add random passwortgenerator in the same function