在rdd中映射CompactBuffer

时间:2017-12-22 16:57:28

标签: scala rdd scala-2.10

我有一个RDD,它是groupByKey,如下所示,

(1,CompactBuffer(2.0,3.0,4.0)), (2,CompactBuffer(1.0,-1.0,-2.0))

我希望将值映射到(1 * x_1 ^ 2,2 * x ^ ^ 2,3 * x_3 ^ 2)

应该是这样的,

(1,CompactBuffer(4.0,18.0,48.0)), (2,CompactBuffer(1.0,2.0,12.0))

我该怎么办?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用mapValues使用zip Stream(1, 2, ...)来处理CompactBuffer内容,如下所示:

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

val groupedRDD = rdd.groupByKey
// res1: Array[(Int, Iterable[Double])] = Array(
//   (1,CompactBuffer(2.0, 3.0, 4.0)), (2,CompactBuffer(1.0, -1.0, -2.0))
// )

groupedRDD.mapValues( l =>
  l.zip(Stream from 1).map{ case (v, i) => v * v * i }
)
// res2: Array[(Int, Iterable[Double])] = Array(
//   (1,List(4.0, 18.0, 48.0)), (2,List(1.0, 2.0, 12.0))
// )