1

我在图的顶点上有 groupBy 的乘积

    val filteredNodesGroups = somegraph.vertices.groupBy{ 
        case(_, attr) => 
        {
            attr
        }
    }

我想为每组顶点创建一个新图,例如

    for ((i,nodegroup) <- filteredNodesGroups){

        ...<transformation to produce a nodegroupRDD from nodegroup>...

        var gr = Graph(nodegroupRDD, somegraph.edges)
    }

问题在于nodegrouptype Iterable[(VertexId, String)],这意味着每个节点组不再是一个 RDD。

我怎样才能克服这个问题,也就是说,我怎样才能为每个重新创建 RDD 结构nodegroup?换句话说,我可以用代码替换...<>...代码以使其正常工作吗?

我尝试使用并行化选项,但从我读到的内容来看,这应该是不可能的,也不是正确的方法。

我将不胜感激任何帮助。干杯

4

1 回答 1

2

如果唯一属性的数量相对较少,您可以在本地收集和创建 RDD:

 val attrs = somegraph.vertices.map{case (_, attr) => attr}.distinct.collect

 val grahps = attrs.map(attr => {
     val vertices = somegraph.vertices.filter{case (_, someAttr) =>
          someAttr == attr
     }
     val edges = somegraph.edges.filter(...) 
     Graph(vertices, edges)
 })

请注意,您可能也应该进行过滤edges,否则您将获得一堆具有null属性的顶点。

另一种方法是使用GraphOps.filter. 它可能更有效,但您仍然需要提供值进行过滤。

于 2015-08-10T16:50:58.753 回答