无论输入如何,使用常数值减少 Spark 中的操作都会给出常数结果

Reduce operation in Spark with constant values gives a constant result irrespective of input

ser = sc.parallelize([1,2,3,4,5])

freq = ser.reduce(lambda x,y : 1+2) 
print(freq). #answer is 3

如果我运行通过给常数值来减少操作,它只给出这两个数字的总和。所以在这种情况下,答案只是 3。虽然我期待它会是 (3+3+3+3=12),因为有 5 个元素并且求和会发生 4 次。在这里无法理解 reduce 的内部结构。有什么帮助吗?

您误解了 reduce 的作用。它不会将聚合操作(由于某种原因您假设为 sum)应用于所有元素的映射(您认为这是您对 lambda x,y : 1+2 所做的操作)

减少 RDD,粗略地说,会做这样的事情:

call your lambda with 1, 2        -> lambda returns 3
carry 3 and call lambda with 3, 3 -> lambda returns 3
carry 3 and call lambda with 3, 4 -> lambda returns 3
carry 3 and call lambda with 3, 5 -> lambda returns 3

reduce方法returns最后一个值,即3

如果您打算为 RDD 中的每个元素计算 1 + 2,那么您需要映射然后归约,例如:

freq = ser.map(lambda x: 1 + 2).reduce(lambda a,b: a+b) #see how reduce works
#which you can rewrite as
freq = ser.map(lambda x: 1 + 2).sum()

但结果是 15,而不是 12(因为有 5 个元素)。我不知道有任何操作可以为每个“减少”步骤计算映射值并允许进一步减少。
这很可能是一个错误的问题,但你可以通过使用上面的 map & reduce 选项,只跳过一个元素来做到这一点,尽管我强烈怀疑这是故意的(因为交换和关联操作reduce 可以调用任意次数,具体取决于 RDD 的分区方式。