如何将两个RDD [Int] s的相应元素相加?

时间:2017-05-28 18:42:25

标签: scala apache-spark

我想做一个非常简单的操作。 我需要实现2个向量之间的加法,对于{1,2,3,4,5},{6,7,8,9,10}我想获得向量{7,9,11,13,15 }。 这两个向量在我的代码中由两个RDD [Int]表示。

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

我知道当我映射另一个RDD时我无法浏览RDD,因此我不知道如何实现这么简单的操作。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

TL; DR 使用zip运算符。

引用RDD.zip

  

zip [U](其他:RDD [U])(隐式arg0:ClassTag [U]):RDD [(T,U)] 将此RDD与另一个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

作为奖励,请考虑使用Spark SQL,这些简单的操作(如foreach(println))如下所示:

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

你已经免费排序&#34;&#34; (!)

答案 1 :(得分:1)

假设您的2 RDD具有相同的尺寸,您可以这样做:

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