在rdd int数组上执行求和

Ada*_*ght 4 apache-spark

是否有任何内置的转换,以便对以下rdd的Int进行求和

org.apache.spark.rdd.RDD[(String, (Int, Int))]
Run Code Online (Sandbox Code Playgroud)

string是键,Int数组是Value,我需要的是得到所有Ints的总和RDD[(String, Int)].我试过groupByKey没有成功......

此外 - 结果集必须再次为rdd.

提前致谢

Shy*_*nki 5

如果目标是对值的元素(Int,Int)求和,那么地图转换可以实现它:

val arr = Array(("A", (1, 1)), ("B", (2, 2)), ("C", (3, 3))

val rdd = sc.parallelize(arr)

val result = rdd.map{ case (a, (b, c)) => (a, b + c) }

// result.collect = Array((A,2), (B,4), (C,6))
Run Code Online (Sandbox Code Playgroud)

相反,如果值类型是数组,则可以使用Array.sum.

val rdd = sc.parallelize(Array(("A", Array(1, 1)), 
                               ("B", Array(2, 2)), 
                               ("C", Array(3, 3)))

rdd.map { case (a, b) => (a, b.sum) }
Run Code Online (Sandbox Code Playgroud)

编辑:

map转换不保留原始分区,因为@Justin建议mapValues可能更合适:

rdd.mapValues{ case (x, y) => x + y }
rdd.mapValues(_.sum) 
Run Code Online (Sandbox Code Playgroud)