【问题标题】:Apache Spark GraphX connected componentsApache Spark GraphX 连接组件
【发布时间】:2015-05-25 21:24:28
【问题描述】:

如何使用 subgraph 函数获取仅包含特定连接组件的顶点和边的图?假设我知道连通组件 id,最终目标是基于连通组件创建一个新图。我想保留原始图中的顶点属性。

【问题讨论】:

    标签: apache-spark spark-graphx


    【解决方案1】:

    您必须将带有组件ID的图加入原始图,通过组件ID过滤(取子图),然后丢弃组件ID。

    import scala.reflect._
    import org.apache.spark.graphx._
    import org.apache.spark.graphx.lib.ConnectedComponents
    
    def getComponent[VD: ClassTag, ED: ClassTag](
        g: Graph[VD, ED], component: VertexId): Graph[VD, ED] = {
      val cc: Graph[VertexId, ED] = ConnectedComponents.run(g)
      // Join component ID to the original graph.
      val joined = g.outerJoinVertices(cc.vertices) {
        (vid, vd, cc) => (vd, cc)
      }
      // Filter by component ID.
      val filtered = joined.subgraph(vpred = {
        (vid, vdcc) => vdcc._2 == Some(component)
      })
      // Discard component IDs.
      filtered.mapVertices {
        (vid, vdcc) => vdcc._1
      }
    }
    

    【讨论】:

    • 感谢这个功能!但是,我们不能假设如果您有 CC id 那么您可能已经构建了 CC,这样就可以将其作为getComponent 的参数之一引入,从而节省可能昂贵的重新计算任务。我很好奇为什么这个功能可以工作,但是当我手动执行这些步骤时,将Long 或任何作为component 的内容都失败了。必须强制转换为SomeVertexId
    • 你是对的——现在我看它很奇怪我们在运行ConnectedComponents之前如何拥有一个组件ID。我想我只是想在某处包含ConnectedComponents。我将重新编写代码以使其更明智。对于您的其他问题:VertexIdLong 的别名。一个普通的旧号码应该在那里工作。这里的“失败”是什么意思?你有例外吗?
    • 你知道如何统计图中连通分量的个数吗?
    • 应该是cc.vertices.values.distinct.count
    【解决方案2】:

    我认为您的问题是,给定源图中的 VertexId,创建一个新图,其中节点和边从源图中连接到该 VertexId。

    鉴于此,我会这样做:

    val targetVertexId = ...
    val graph = Graph(..., ...)
    val newGraph = Graph(
      graph.vertices.filter{case (vid,attr) => vid == targetVertexId} ++
      graph.collectNeighbors(EdgeDirection.Either)
        .filter{ case (vid,arr) => vid == targetVertexId}
        .flatMap{ case (vid,arr) => arr},
      graph.edges
    ).subgraph(vpred = { case (vid,attr) => attr != null})
    

    需要注意的几点:

    您可以根据需要将EdgeDirection.Either 更改为EdgeDirection.InEdgeDirection.Out

    末尾的.subgraph 删除属性设置为null 的所有顶点。如果原始val graph 的顶点属性设置为null,这将不起作用。否则,这可以工作,而无需事先知道 Vertex 属性类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多