从图的RDD创建边的RDD

时间:2018-08-02 13:42:27

标签: scala apache-spark spark-graphx

考虑图形集合。在我目前的情况下,它是一个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”而预期会失败

1 个答案:

答案 0 :(得分:-1)

查看.toLocalIterator。此方法可让您将EdgesRDD转换为Iterable,而flatMap将完成工作。

请记住,此操作可能会很昂贵。如果未缓存类型RDD的初始RDD[Graph[VD, Double]],则应考虑对其进行缓存。 toLocalIterator将依次获取EdgesRDD的每个分区。

您的最终通话可能看起来像这样

graphs.flatMap(_.edges.toLocalIterator)