如何对RDD中列表的一部分求和

How to Sum a part of a list in RDD

我有一个RDD,我想对列表的一部分求和。

(key, element2 + element3)
(1, List(2.0, 3.0, 4.0, 5.0)), (2, List(1.0, -1.0, -2.0, -3.0))

输出应该是这样的,

(1, 7.0), (2, -3.0)

谢谢

您可以 map 并在第二部分建立索引:

yourRddOfTuples.map(tuple => {val list = tuple._2; list(1) + list(2)})

评论后更新,将其转换为Vector:

yourRddOfTuples.map(tuple => {val vs = tuple._2.toVector; vs(1) + vs(2)})

或者如果您不想使用转化:

yourRddOfTuples.map(_._2.drop(1).take(2).sum)

这会从元组的第二个元素 (.map(_._2) 跳过第一个元素 (.drop(1)),取下两个 (.take(2))(如果您有less) 并对它们求和 (.sum).

您可以mapkey-list pair获取第2和第3个列表元素如下:

val rdd = sc.parallelize(Seq(
  (1, List(2.0, 3.0, 4.0, 5.0)),
  (2, List(1.0, -1.0, -2.0, -3.0))
))

rdd.map{ case (k, l) => (k, l(1) + l(2)) }.collect
// res1: Array[(Int, Double)] = Array((1,7.0), (2,-3.0))