对 rdd int 数组执行求和
Performing sum on a rdd int array
是否有任何内置转换可以对以下 rdd
的整数求和
org.apache.spark.rdd.RDD[(String, (Int, Int))]
string 是键,Int 数组是值,我需要的是将所有 Int 的总和作为 RDD[(String, Int)]
。我尝试了 groupByKey 但没有成功...
此外- 结果集必须再次是 rdd。
提前致谢
如果objective是对value(Int, Int)的元素求和,那么一个map转换就可以实现:
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))
如果值类型是数组,则可以使用 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) }
编辑:
map
转换不保留原始分区器,正如@Justin 建议的那样 mapValues
在这里可能更合适:
rdd.mapValues{ case (x, y) => x + y }
rdd.mapValues(_.sum)
以下是 pyspark 中的几种方法。
rdd = sc.parallelize([ ('A', (1,1)), ('B', (2,2)), ('C', (3, 3)) ])
rdd.mapValues(lambda (v1, v2): v1+v2).collect()
或
>>> rdd.map(lambda (k, v): (k, sum(v))).collect()
[('A', 2), ('B', 4), ('C', 6)]
或者
>>> rdd.map(lambda (k, v): (k, (v[0] + v[1]))).collect()
[('A', 2), ('B', 4), ('C', 6)]
或者
>>> def fn(x):
... k_s = (x[0], sum(x[1]))
... print k_s
...
>>> rdd.foreach(fn)
('C', 6)
('A', 2)
('B', 4)
是否有任何内置转换可以对以下 rdd
的整数求和org.apache.spark.rdd.RDD[(String, (Int, Int))]
string 是键,Int 数组是值,我需要的是将所有 Int 的总和作为 RDD[(String, Int)]
。我尝试了 groupByKey 但没有成功...
此外- 结果集必须再次是 rdd。
提前致谢
如果objective是对value(Int, Int)的元素求和,那么一个map转换就可以实现:
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))
如果值类型是数组,则可以使用 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) }
编辑:
map
转换不保留原始分区器,正如@Justin 建议的那样 mapValues
在这里可能更合适:
rdd.mapValues{ case (x, y) => x + y }
rdd.mapValues(_.sum)
以下是 pyspark 中的几种方法。
rdd = sc.parallelize([ ('A', (1,1)), ('B', (2,2)), ('C', (3, 3)) ])
rdd.mapValues(lambda (v1, v2): v1+v2).collect()
或
>>> rdd.map(lambda (k, v): (k, sum(v))).collect()
[('A', 2), ('B', 4), ('C', 6)]
或者
>>> rdd.map(lambda (k, v): (k, (v[0] + v[1]))).collect()
[('A', 2), ('B', 4), ('C', 6)]
或者
>>> def fn(x):
... k_s = (x[0], sum(x[1]))
... print k_s
...
>>> rdd.foreach(fn)
('C', 6)
('A', 2)
('B', 4)