0

希望有人能够提供帮助。在spark和graphx问题中的foreach循环中划线

我正在尝试编写一个程序,该程序需要对连接到graphx网络中每个节点的每个边缘ID执行一项功能。

要做到这一点,我想遍历每个节点,并确定连接到它的所有边,然后我想用一个函数遍历每个边。在foreach循环中进行任何类型的子图或过滤时,似乎会出现我的问题。

因此,例如,下面的代码应输出连接到节点的每个边的id

graph.vertices.foreach { 
    network => 
    val KeyVert = network._1 
val EGraph = graph.subgraph(e => e.dstId == KeyVert) 
println(KeyVert) 
EGraph.edges.foreach(println) 
} 

然而,将仅如果添加收集功能,收集从RDD例如图形数据的工作

graph.vertices.collect.foreach { 
    network => 
    val KeyVert = network._1 
val EGraph = graph.subgraph(e => e.dstId == KeyVert) 
println(KeyVert) 
EGraph.edges.foreach(println) 
} 

该网络太大,无法收集边缘数据,所以任何帮助将不胜感激。

回答

0

em ...问题是你不懂驱动程序和工作人员......当你调用collect函数时,所有的数据都被收集到驱动程序中,然后foreach函数看起来很好用。其实graph.vertices.foreach没有报告任何错误,对吧?因为它工作得很好,只需在工作人员的日志中打印信息即可。你知道我说了什么吗?希望能帮助到你。

0
graph.vertices.map { 
    network => 
    val KeyVert = network._1 
    val EGraph = graph.subgraph(e => e.dstId == KeyVert) 
    println(KeyVert) 
    EGraph.edges.map(println) 
} 

这可能会解决您的问题。