我有一个键值数据,让我们称之为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的误解是什么?
1 回答
让我们崩溃 -
t1有三个值('t1',(2,0.8)),('t1',(3,0.1))和('t1',(4,0.3))
在reduceByKey的第一次传递期间,输出将是 -
在下一次传球中,它会
所以,这里完成的有效积累是
(2 * 0.8 + 3*0.1 )*(0.8+0.1) + (4 * 0.3)
而不是你想要的(2*0.8 + 3*0.1+4*0.3)