Heim >Datenbank >MySQL-Tutorial >Wie finde ich effizient die Top-N-Elemente pro Gruppe in einem Spark-DataFrame?
Einführung:
Spark DataFrame bietet leistungsstarke Funktionen zum Bearbeiten und Aggregieren von Daten. Das Gruppieren von Daten basierend auf bestimmten Spalten und das anschließende Durchführen von Vorgängen innerhalb jeder Gruppe, z. B. das Finden der obersten N-Werte, ist eine häufige Anforderung in der Datenverarbeitung.
Problemstellung:
Bedenken Sie a Spark DataFrame mit Spalten wie Benutzer, Artikel und Bewertung. Die Aufgabe besteht darin, die Daten nach Benutzer zu gruppieren und die obersten N Elemente aus jeder Gruppe zurückzugeben, wobei N eine vordefinierte Zahl ist.
Lösung:
Verwenden Fensterfunktionen:
Scala Code:
import org.apache.spark.sql.expressions.Window import org.apache.spark.sql.functions.{rank, desc} val n: Int = ??? // Window definition val w = Window.partitionBy($"user").orderBy(desc("rating")) // Filter df.withColumn("rank", rank.over(w)).where($"rank" <= n)
Erklärung:
Dieser Code nutzt Fensterfunktionen, um Elemente innerhalb jeder Benutzergruppe basierend auf der Bewertungsspalte in absteigender Reihenfolge zu ordnen. Die Rangfunktion weist jeder Zeile innerhalb der Partition einen Rang zu und gibt ihre Position in der sortierten Liste an. Durch Filtern nach Rang <= n werden nur die obersten N Elemente aus jeder Gruppe beibehalten.
Verwenden der row_number-Funktion:
Wenn Sie nicht damit umgehen müssen Bei Bindungen (Fälle, in denen mehrere Elemente den gleichen Rang haben) können Sie row_number anstelle von rank verwenden. Der Code ähnelt weiterhin dem oben, wobei row_number.over(w) rank.over(w) im withColumn-Ausdruck ersetzt.
Durch die Nutzung dieser Gruppierungs- und Fenstertechniken können Sie die obersten N Elemente darin effizient finden jede Gruppe in Ihrem Spark DataFrame, sodass Sie effektiv wertvolle Erkenntnisse aus Ihren Daten extrahieren können.
Das obige ist der detaillierte Inhalt vonWie finde ich effizient die Top-N-Elemente pro Gruppe in einem Spark-DataFrame?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!