Scala 从图的RDD创建边的RDD

Scala 从图的RDD创建边的RDD,scala,apache-spark,spark-graphx,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,输出应该是一个RDD[Edge[D

考虑一组图。在我目前的例子中,它是一个
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,输出应该是一个
RDD[Edge[Double]]
包含{e1、e2、e3、e4、e5、e6、e7、e8、e9}

首先,我尝试了flatMap(
graphs.flatMap(graph=>graph.edges)
),但得到了一个类型不匹配错误,指出需要TraversableOnce[?]类型,但找到了EdgeRDD[Double]


此外,我还尝试首先使用
graphs.map(graph=>graph.edges)
创建EdgeRDD[Double]集合,以进一步修改它,但由于“Spark不支持嵌套RDD”,它预期会失败。

请看
。toLocalIterator
。此方法允许您将
EdgesRDD
转换为
Iterable
,而
flatMap
将完成此工作

请记住,此操作可能会很昂贵。如果您的初始代码< >代码> RDD <代码> > RDD [图[VD,双] ] /代码>未被缓存,则应该考虑缓存它。code>ToLocalitator将按顺序获取
EdgesRDD
的每个分区

你最后的电话可能是这样的

graphs.flatMap(_.edges.toLocalIterator)

我一定会分析一下。我不在我的工作站上,但我在spark shell和graphs.flatMap(u.edges.ToLocalitator.collect)中做了一个快速测试。collect返回一个错误(java.lang.NullPointerException,从堆栈跟踪中几乎看不出)。似乎toLocalIterator有一个警告。正如您所指出的,Spark不支持嵌套RDD,因此您不能使用工作的
RDD[Graph[VD,Double]
。如果你有
Seq[Graph[u,]]
,那么只需
map
union