我想做一个非常简单的操作。 我需要实现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,因此我不知道如何实现这么简单的操作。 我该怎么办?
答案 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 }