Mapreduce reduceByKey每次返回不同的值

Mapreduce reduceByKey每次返回不同的值,mapreduce,pyspark,Mapreduce,Pyspark,我有一个键值数据,我们称之为x。它由一把钥匙、一对体积和重量组成。看起来像这样 [('t1', (2, 0.8)), ('t1', (3, 0.1)), ('t1', (4, 0.3)), ('t2', (3, 0.8)), ('t2', (10, 0.3))] 我想计算t1和t2的加权体积值。那是我计算的 t1为2*0.8+3*0.1+4*0.3 t2为3*0.8+10*0.3 我能行 x.map(lambda (x, (y, z)): (x, y*z)).reduceByKey(l

我有一个键值数据,我们称之为x。它由一把钥匙、一对体积和重量组成。看起来像这样

[('t1', (2, 0.8)),
 ('t1', (3, 0.1)),
 ('t1', (4, 0.3)),
 ('t2', (3, 0.8)),
 ('t2', (10, 0.3))]
我想计算t1和t2的加权体积值。那是我计算的

t1为2*0.8+3*0.1+4*0.3

t2为3*0.8+10*0.3

我能行

x.map(lambda (x, (y, z)): (x, y*z)).reduceByKey(lambda x,y: x+y).collect()
我会得到正确的号码

[('t2', 5.4), ('t1', 3.1)]
我的问题是,如果我使用原始输入x,并运行reduceByKey操作,例如

x.reduceByKey(lambda (f1, w1), (f2, w2): (f1 * w1 + f2 * w2, w1 + w2)).collect()
我希望得到一份工作

[('t2', 5.4, 1.1), ('t1', 3.1, 1.2)]
但是,每次运行reduceByKey操作时,我都会得到不同的结果:

[('t2', (5.4, 1.1)), ('t1', (3.38, 1.2000000000000002))]
[('t2', (5.4, 1.1)), ('t1', (2.2, 1.2000000000000002))]
[('t2', (5.4, 1.1)), ('t1', (2.91, 1.2))]
我对reduceByKey有什么误解?

让我们来分析一下-

t1有三个值('t1',(2,0.8)),('t1',(3,0.1))和('t1',(4,0.3))

在reduceByKey的第一个过程中,输出将为-

(2,0.8),(3,0.1) => (2*0.8 + 3*0.1,0.8+0.1) == (1.9,0.9)
在下一关,它将是

(1.9,0.9),(4,0.3) => (1.9*0.9+ 4*0.3,0.9+0.3) == (2.91,1.2)
因此,这里所做的有效积累是
(2*0.8+3*0.1)*(0.8+0.1)+(4*0.3)
,而不是你的意愿是
(2*0.8+3*0.1+4*0.3)