考虑图形集合。在我目前的情况下,它是一个RDD[Graph[VD, Double]]
,但是如果可以使答案更容易,则可以将其重做为Seq[Graph[VD, Double]]
,但是我更喜欢前者。
我的问题是,如何有效地创建一个RDD[Edge[Double]]
,其中包含集合中每个图形的边缘?
作为示例,让图形集合包含三个图形G1,G2和G3。令G1具有边集合{e1,e2,e3},G2具有边集合{e4,e5},而G3具有边集合{e6,e7,e8,e9}。对于包含G1,G2和G3的图的输入RDD,输出应为包含{e1,e2,e3,e4,e5,e6,e7,e8,e9}的RDD[Edge[Double]]
。
首先,我尝试使用flatMap(graphs.flatMap(graph => graph.edges)
),但出现类型不匹配错误,指出需要TraversableOnce [?]类型,但是找到了EdgeRDD [Double]。
此外,我尝试首先使用graphs.map(graph => graph.edges)
创建EdgeRDD [Double]的集合,目的是进一步对其进行修改,但由于“ Spark不支持嵌套的RDD”而预期会失败
答案 0 :(得分:-1)
查看.toLocalIterator
。此方法可让您将EdgesRDD
转换为Iterable
,而flatMap
将完成工作。
请记住,此操作可能会很昂贵。如果未缓存类型RDD
的初始RDD[Graph[VD, Double]]
,则应考虑对其进行缓存。 toLocalIterator
将依次获取EdgesRDD
的每个分区。
您的最终通话可能看起来像这样
graphs.flatMap(_.edges.toLocalIterator)