2017-04-17 8 views
0

私はキー値のデータを持っています。これをxとしましょう。これは、キーと、ボリュームと重量のペアで構成されています。これは次のようになりますreduceByKeyは毎回異なる値を返します

[('t1', (2, 0.8)), 
('t1', (3, 0.1)), 
('t1', (4, 0.3)), 
('t2', (3, 0.8)), 
('t2', (10, 0.3))] 

それぞれのt1とt2の重み付けボリューム値を計算します。それは私は私が

x.map(lambda (x, (y, z)): (x, y*z)).reduceByKey(lambda x,y: x+y).collect() 

になる行うことができT2

ためT1

* 0.3

3 * 0.8 + 10用* 0.3 + 3

2 * 0.8 * 0.1 + 4の計算であります正しい番号を取得する

[('t2', 5.4), ('t1', 3.1)] 

私は元の入力xを使用し、そのようなreduceByKey操作を実行する私は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))] 

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操作を実行するたびに取得しています?

T1の3つの値( 'T1'、(2、0.8))、( 'T1'、(3、0.1))と( 'T1'、(4、0.3)を有する -

答えて

0

は分解できreduceByKeyの第1のパス中に)

、出力がされる -

(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)

+0

私はとてもデュエルです。ありがとう@Pushkr – user2773013

関連する問題