我在图的顶点上有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选项,但是根据我的阅读,它应该是不可能的,也不是正确的方法。
我将不胜感激任何帮助。 干杯
答案 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
。它可能更有效,但您仍需要提供值来过滤。