Ihre Eingabedaten wurden geringfügig geändert.
val scores = sc.parallelize(Array(
("a", 1),
("a", 2),
("a", 3),
("b", 3),
("b", 1),
("a", 4),
("b", 4),
("b", 2),
("a", 6),
("b", 8)
))
ich erklären, wie es Schritt für Schritt zu tun:
1.Group durch Schlüssel erstellen Array
scores.groupByKey().foreach(println)
Ergebnis:
(b,CompactBuffer(3, 1, 4, 2, 8))
(a,CompactBuffer(1, 2, 3, 4, 6))
Wie Sie sehen, jeder Wert selbst ist ein Array von Zahlen. CompactBuffer ist nur ein optimiertes Array.
2.Für jede Taste, umgekehrte Sortierung Liste von Zahlen dieser Wert enthält
scores.groupByKey().map({ case (k, numbers) => k -> numbers.toList.sorted(Ordering[Int].reverse)}).foreach(println)
Ergebnis:
(b,List(8, 4, 3, 2, 1))
(a,List(6, 4, 3, 2, 1))
3.Keep nur ersten zwei Elemente aus dem zweiten Schritt, werden sie oben sein 2 Partituren in der Liste
scores.groupByKey().map({ case (k, numbers) => k -> numbers.toList.sorted(Ordering[Int].reverse).take(2)}).foreach(println)
Ergebnis:
(a,List(6, 4))
(b,List(8, 4))
4.Flat Karte neu Gekoppelte RDD für jeden Schlüssel und Bestnote
scores.groupByKey().map({ case (k, numbers) => k -> numbers.toList.sorted(Ordering[Int].reverse).take(2)}).flatMap({case (k, numbers) => numbers.map(k -> _)}).foreach(println)
Ergebnis zu erstellen:
(b,8)
(b,4)
(a,6)
(a,4)
5.Optional Schritt - sortiert nach Schlüssel, wenn Sie wollen
scores.groupByKey().map({ case (k, numbers) => k -> numbers.toList.sorted(Ordering[Int].reverse).take(2)}).flatMap({case (k, numbers) => numbers.map(k -> _)}).sortByKey(false).foreach(println)
Ergebnis:
(a,6)
(a,4)
(b,8)
(b,4)
Hoffnung, diese Erklärung half, die Logik zu verstehen.
Dies scheint nicht zu funktionieren?Dies ist die Ausgabe: Array [(String, (Int, Int))] = Array ((a, (4,4)), (b, (4,4))) –
Ich habe das durch die Anpassung der Antwort von user52045 gelöst : val Scores = sc.parallelize (Array ( ("a", 1), ("a", 2), ("a", 3), ("B", 3), ("b", 1), ("a", 4), ("b", 4), ("b", 2) )) scores.mapValues (p => (p, p)) .reduceByKey ((u, v) => { valwerte = Liste (u._1, u._2, v._1, v._2) .sortiert (Bestellung [Int] .reverse) .distinct (Werte (0), Werte (1)) }). Collect() –
@michael_erasmus Sie haben Recht, es gibt einen Fehler in meinem Code. Thx für die Befestigung. Eine Sache müssen Sie vorsichtig sein, denn wenn alle Elemente der Liste identisch sind, erhalten Sie outOfBoudException. – abalcerek