2016-11-12 21 views
1

我想使用Scala和GraphX計算源節點和目標節點之間的最短距離。但下面的代碼給了我所有節點之間的最短距離。在Apache Spark圖中僅選擇兩個節點之間的距離

val sourceId: VertexId = 37 
val g = graph.mapVertices((id, _) => 
       if (id == sourceId) 0.0 
       else Double.PositiveInfinity 
      ) 
val sssp = g.pregel(Double.PositiveInfinity)(
       (id, dist, newDist) => math.min(dist, newDist), 
       triplet => { 
       if (triplet.srcAttr + triplet.attr < triplet.dstAttr) { 
        Iterator((triplet.dstId, triplet.srcAttr + triplet.attr)) 
       } 
       else { 
        Iterator.empty 
       } 
       }, 
       (a, b) => math.min(a, b) 
       ) 

輸出:

(Dest Node,shortest Distance) 
(18,991.6112077930221) 
(38,379.8315724661152) 
(14,1442.036238189988) 
(22,1494.3250833673349) 
(30,451.119421079875) 
(10,1525.2322402611999) 
(56,2313.01408644027) 
(20,970.9823341266101) 

例如:我想計算源節點之間的距離:不是所有的節點間18:37至目的地節點。 您可以請指導我如何在此代碼中指定目標節點,以便我可以找到源和目標之間的正確距離,而不是所有節點之間。

回答

2

如何過濾輸出,並只保留感興趣的節點?在你的情況下,這將是:

sssp.vertices.filter { case (destId, _) => 
    destId == 18 
} 

這將在輸出中留下(18,991.6112077930221)

+0

您可以在該RDD上調用'collect()'方法。所以它會是這樣的:'sssp.vertices.filter(...)。collect()foreach println' –

+0

我已經實現了上面的代碼使用過濾它工作正常的小no節點和邊緣。但是在處理大型(50k +)邊緣和節點時遇到了問題。手術時間超過一天。有沒有其他方法可以修改上面的代碼而僅僅是源和目標節點而不需要過濾輸出。 – Aroon