Ich möchte diese bestimmte Apache Spark mit Python-Lösung teilen, weil die Dokumentation dafür ziemlich schlecht ist.Berechnung der Durchschnittswerte für jede KEY in einer paarweisen (K, V) RDD in Spark mit Python
Ich wollte den Durchschnittswert von K/V-Paaren (gespeichert in einer paarweisen RDD), von KEY. Hier ist, was die Beispieldaten wie folgt aussehen:
>>> rdd1.take(10) # Show a small sample.
[(u'2013-10-09', 7.60117302052786),
(u'2013-10-10', 9.322709163346612),
(u'2013-10-10', 28.264462809917358),
(u'2013-10-07', 9.664429530201343),
(u'2013-10-07', 12.461538461538463),
(u'2013-10-09', 20.76923076923077),
(u'2013-10-08', 11.842105263157894),
(u'2013-10-13', 32.32514177693762),
(u'2013-10-13', 26.249999999999996),
(u'2013-10-13', 10.693069306930692)]
Nun ist die folgende Codesequenz ein suboptimal Weg, es zu tun, aber es funktioniert. Es war, was ich getan habe, bevor ich eine bessere Lösung gefunden habe. Es ist nicht schlimm, aber - wie Sie in der Antwort sehen werden - gibt es einen prägnanteren, effizienteren Weg.
>>> import operator
>>> countsByKey = sc.broadcast(rdd1.countByKey()) # SAMPLE OUTPUT of countsByKey.value: {u'2013-09-09': 215, u'2013-09-08': 69, ... snip ...}
>>> rdd1 = rdd1.reduceByKey(operator.add) # Calculate the numerators (i.e. the SUMs).
>>> rdd1 = rdd1.map(lambda x: (x[0], x[1]/countsByKey.value[x[0]])) # Divide each SUM by it's denominator (i.e. COUNT)
>>> print(rdd1.collect())
[(u'2013-10-09', 11.235365503035176),
(u'2013-10-07', 23.39500642456595),
... snip ...
]
Das ist wirklich eine großartige Antwort. Ich werde jedoch feststellen, dass dies aufgrund von [PEP 3113] (https://www.python.org/dev/peps/pep-3113/) nur mit Python 2.x kompatibel ist, da das Tupel-Entpacken in Lambda-Ausdrücken nein ist länger unterstützt in Python 3.x – Tgsmith61591
@ Tgsmith61591 Vielen Dank. Ich habe die Zwischenvariable "aTuple" hinzugefügt, um dies zu beheben. (Seufz, ich konnte mir keinen besseren Bezeichner nennen, LoL). Schöner Fang auf PEP 3113! –