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)
    }

問題は、それnodegroupが typeIterable[(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 に答える