2017-05-28 313 views
0

我想做一個非常簡單的操作。 我需要實現2個向量之間的加法,{1,2,3,4,5},{6,7,8,9,10}我想獲得向量{7,9,11,13, 15}。 2個向量在我的代碼中由兩個RDD [Int]表示。如何求和兩個RDD [Int] s的相應元素?

val v1 = sc.parallelize(List(1,2,3,4,5)) 
val v2 = sc.parallelize(List(6,7,8,9,10)) 

我知道,我不能瀏覽RDD當我映射一個又一個因爲這個我不知道該怎樣實現這樣的簡單的操作理念。 我該怎麼辦?

回答

2

TL; DR使用zip算子。

引用RDD.zip

拉鍊[U](其他:RDD [U])(隱式爲arg0:ClassTag [U]):RDD [(T,U)]拉鍊此RDD與另一一個,返回鍵 - 值對與在每個RDD每個RDD,第二元件與第一元件等

在你的情況,這將會被如下:

val zipped = v1 zip v2 // <-- you may want to use v1.zip(v2) instead to keep types 
zipped.map { case (x, y) => x + y }  
scala> zipped.map { case (x, y) => x + y }.foreach(println) 
11 
13 
9 
15 
7 

作爲獎勵,請考慮星火SQL哪裏這麼簡單的操作(如foreach(println))將如下所示:

val sums = zipped.map { case (x, y) => x + y }.toDF("sum") 
scala> sums.show 
+---+ 
|sum| 
+---+ 
| 7| 
| 9| 
| 11| 
| 13| 
| 15| 
+---+ 

,你已經有了排序 「免費」

1
(!)

假設您的2 RDD s具有相同的尺寸,您可以這樣做:

val res: RDD[Int] = v1.zip(v2).map { case (a, b) => a + b } 
相關問題