2017-06-21 19 views
0

我會嘗試以一般方式提出問題。對我的RDD的所有元素執行功能

我有這樣

myFunction (Object first, Object second) 

的功能,我有對象RDD [Object]的RDD。

我需要在所有RDD的元素執行myFunction的,在過程結束時,我必須確保我的對象的所有的夫妻都與myfunction的(..,..)

一種方式進行,也許,是創建一個廣播變量(如我RDD的副本),而且比

val broadcastVar = sc.broadcast(rdd.collect()) 
rdd_line.mapPartitions(p=> { 
    var brd = broadcastVar.value 
    var result = new ListBuffer[Double]() 
    brd.foreach(b => { 
    p.foreach(e => result+= myfunction(b ,e)) 
    }) 
    result.toList.toIterator 
}) 

還有另一種方法具有更好的性能做到這一點?

+1

調用收集整個大數據對象以便再次修改/廣播它通常是一種反模式。而是使用Spark映射,減少,過濾或類似的東西來轉換大數據對象。 – Paul

回答

2

使用RDD的.cartesian方法來獲得包含這兩個元素中所有元素的RDD。在這種情況下,你想要的RDD的笛卡爾與自身:

rdd.cartesian(rdd).map({ case (x, y) => myFunction(x, y) }) 

注意,這將包括與自身的元素對,對,這兩個訂單,即(A,B)和(B,A )。和(a,a)。

相關問題