无论输入如何,使用常数值减少 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 的分区方式。
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 的分区方式。