要保留这篇简短的帖子,但很高兴在必要时添加更多背景/细节。我有一个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)
然而,这并没有给我我想要的东西。任何帮助赞赏!谢谢!
答案 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)))