2017-04-17 2 views
0

Ich habe einen Schlüssel Wert Daten, nennen wir das x. Es besteht aus einem Schlüssel und einem Paar Volumen und Gewicht. Es sieht so ausreduceByKey gibt jedes Mal einen anderen Wert zurück

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

Ich möchte den gewichteten Volumenwert für jedes t1 und t2 berechnen. Das heißt I

2 * 0,8 + 3 * 0,1 + 4 · 0,3 für t1

3 * 0,8 + 10 * 0.3 für T2

berechnen I

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

tun würde ich holen Sie sich die richtige Anzahl

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

Meine Frage ist, wenn ich den ursprünglichen Eingang x, und führen Sie einen solchen reduceByKey Betrieb als

x.reduceByKey(lambda (f1, w1), (f2, w2): (f1 * w1 + f2 * w2, w1 + w2)).collect() 

Ich hatte gehofft,

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

jedoch zu bekommen, erhalte ich jedes Mal unterschiedliche Ergebnisse ich die reduceByKey Operation auszuführen:

[('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))] 

Was bin ich aus dem reduceByKey Missverständnis ?

Antwort

0

Lets brechen -

t1 hat drei Werte ('T1', (2, 0,8)), ('T1', (3, 0,1)) und ('T1', (4, 0.3))

beim ersten Durchlauf von reduceByKey, wird ausgegeben -

(2,0.8),(3,0.1) => (2*0.8 + 3*0.1,0.8+0.1) == (1.9,0.9) 

in nächsten Durchgang, wird es

(1.9,0.9),(4,0.3) => (1.9*0.9+ 4*0.3,0.9+0.3) == (2.91,1.2) 

so, effektive Akkumulations getan h sein er ist (2 * 0.8 + 3*0.1)*(0.8+0.1) + (4 * 0.3) statt Ihrer Absicht, die war (2*0.8 + 3*0.1+4*0.3)

+0

ich bin so DUUUUUH. danke @Pushkr – user2773013

Verwandte Themen