【发布时间】:2017-12-23 02:40:17
【问题描述】:
我有一个 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)
谢谢
【问题讨论】:
标签: scala apache-spark rdd scala-2.10
我有一个 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)
谢谢
【问题讨论】:
标签: scala apache-spark rdd scala-2.10
您可以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))(如果你有更少,可能会更少)并将它们相加(@987654329 @)。
【讨论】:
List,但转换为 Vector 应该可以解决该问题。
您可以通过mapkey-list 对来获取第 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))
【讨论】:
toList 将其转换为列表。