2016-09-02 1 views
0
val temp1 = tempTransform.map({ temp => ((temp.getShort(0), temp.getString(1)), (USAGE_TEMP.getDouble(2), USAGE_TEMP.getDouble(3)))}) 
    .reduceByKey((x, y) => ((x._1+y._1),(x._2+y._2))) 

Hier habe ich Sum Operation ausgeführt aber ist es möglich Zählung Betrieb innerhalb reduceByKey zu tun.Count Betrieb in reduceByKey in Funken

Wie, was ich denke,

reduceByKey((x, y) => (math.count(x._1),(x._2+y._2))) 

Aber das funktioniert nicht jeden Vorschlag bitte.

+0

Können Sie erklären, was Sie mit "count" meinen? Meinst du die Anzahl der Datensätze pro Schlüssel zu zählen? Oder verschiedene "x._1" -Werte zählen? Vielleicht geben Sie eine Beispieleingabe und erwartete Ausgabe. –

+0

Meinst du die Anzahl der Datensätze pro Schlüssel zu zählen? Ja. (Wie Aggregatbetrieb). ex. math.sum (x._2 + y._2) geben Sie die Summe aller Datensätze an, die den Schlüssel erfüllt haben. Gleichermaßen suche ich nach Count-Operation. – Darshan

Antwort

0

Nun, das Zählen ist äquivalent 1 s Summieren, so Karte nur das erste Element in jedem Wert Tupels in 1 und beide Teile des Tupels summieren, wie Sie zuvor:

val temp1 = tempTransform.map { temp => 
    ((temp.getShort(0), temp.getString(1)), (1, USAGE_TEMP.getDouble(3))) 
} 
.reduceByKey((x, y) => ((x._1+y._1),(x._2+y._2))) 

Ergebnis ein RDD[((Short, String), (Int, Double))] wäre Das erste Element im Wert tuple (Int) ist die Anzahl der ursprünglichen Datensätze, die mit diesem Schlüssel übereinstimmen.

Das ist eigentlich das klassische Map-Reduce-Beispiel - word count.

0

Nein, das geht nicht. RDD stellt ein Iteratormodell für die Lazy-Berechnung bereit. So wird jedes Element nur einmal besucht.

Wenn Sie wirklich sum wie beschrieben tun möchten, partitionieren Sie zuerst Ihre rdd, dann verwenden Sie mapWithPartition, implementieren Sie Ihre Berechnung in Schließung (Denken Sie daran, dass Elemente in RDD nicht in Ordnung ist).