在火花graphx中将Iterable转换为RDD

时间:2015-08-10 11:07:35

标签: scala apache-spark spark-graphx

我在图的顶点上有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)
    }

问题是nodegroup的类型为Iterable[(VertexId, String)],这意味着每个节点组不再是RDD。

我怎样才能解决这个问题,也就是说,如何为每个nodegroup重新创建RDD结构?换句话说,我可以用{替换...<>...代码,以使其有效吗?

我尝试使用parallelize选项,但是根据我的阅读,它应该是不可能的,也不是正确的方法。

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

1 个答案:

答案 0 :(得分: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。它可能更有效,但您仍需要提供值来过滤。