将列表的PythonRDD缩减为一个列表

时间:2017-06-04 04:37:34

标签: python apache-spark pyspark rdd

要保留这篇简短的帖子,但很高兴在必要时添加更多背景/细节。我有一个PythonRDD,如下所示:

print(myRDD)
PythonRDD[4] at RDD at PythonRDD.scala:43

print(myRDD.take(1))
[[0.305, 0.302, -0.005, 0.302]]

print(myRDD.collect())
[[0.305, 0.302, -0.005, 0.302], 
 [0.294, 0.183, 0.084, 0.277], 
 [0.184, 0.997, -1.123, 0.654]]

3个列表中的每一个都包含2x2矩阵的4个值。我想将这3个矩阵加在一起,因此我想在myRDD上使用一些reduce函数,使输出为:

[[.783, 1.482, -1.044, 1.233]] 

其中.783 = .305 + .294 + .184等我试过:

myRDD.reduce(lambda a, b: a + b)

然而,这并没有给我我想要的东西。任何帮助赞赏!谢谢!

3 个答案:

答案 0 :(得分:1)

你需要的是下面的东西 -

myRDD.reduce(lambda a, b: [a[0] + b[0], a[1]+b[1],a[2]+b[2],a[3]+b[3]])

答案 1 :(得分:0)

在这种情况下, reduce()函数内的迭代,lambda function a,b遍历RDD的行,所以:

  • 第一次迭代:

a 是RDD中的第一行

b 是RDD中的第二行

  • 第二次迭代:

a 是在上一步使用lambda函数应用的操作的结果

b 是RDD的第三行

依此类推,直到最后一行。

因此,由于 line 是一个列表,如果要将行的第一个元素与下一行的第一个元素相加,则必须执行a[0] + b[0],第二个元素a[1] + b[1]之和等等。

解决方案:

>>> finalList = myRDD.reduce(lambda a, b: [a[0]+b[0], a[1]+b[1], a[2]+b[2], a[3]+b[3]])
[0.7829999999999999, 1.482, -1.044, 1.233]

然后,如果您需要对列表中的元素进行舍入,则可以在列表推导中使用 round()命令。

>>> myFormattedList = [round(elem,3) for elem in finalList]
>>> myFormattedList
[0.783, 1.482, -1.044, 1.233]

答案 2 :(得分:0)

sc = SparkContext(appName='MyApp')
data = \
    [[0.305, 0.302, -0.005, 0.302],
     [0.294, 0.183, 0.084, 0.277],
     [0.184, 0.997, -1.123, 0.654]]

res = sc.parallelize(data).reduce(lambda x, y: map(sum, zip(x, y)))