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) 
} 

這可能會解決您的問題。