Heim >Datenbank >MySQL-Tutorial >Wie erhalte ich die Top-N-Datensätze für jede Gruppe in einem Spark-DataFrame?
TopN für jede Gruppe in einem DataFrame abrufen
In Spark DataFrame müssen wir Daten häufig nach einer bestimmten Spalte gruppieren und den oberen Wert abrufen N Datensätze aus jeder Gruppe. Sie verfügen beispielsweise über einen DataFrame mit Bewertungsdaten zu Benutzerartikeln und möchten für jeden Benutzer die am besten bewerteten Artikel finden.
Scala-Lösung
The Scala Die Lösung dieses Problems besteht in der Verwendung einer Rangfensterfunktion. So können Sie es machen:
Definieren Sie den oberen N-Wert:
val n: Int = ???
Erstellen Sie eine Fensterdefinition, um Daten durch den Benutzer zu partitionieren Spalte und ordnen Sie die Datensätze in absteigender Reihenfolge ihrer Bewertung:
val w = Window.partitionBy($"user").orderBy(desc("rating"))
Rang hinzufügen Spalte zum DataFrame mithilfe der Rangfunktion:
df.withColumn("rank", rank().over(w))
Filtern Sie den DataFrame, um nur die obersten N Datensätze aus jeder Gruppe beizubehalten:
df.where($"rank" <= n)
Alternative mit Zeilennummer
Wenn Sie Bindungen nicht unterbrechen müssen, können Sie verwenden die row_number-Funktion anstelle der rank-Funktion. Dadurch erhalten Sie eine eindeutige Zeilennummer für jeden Datensatz in jeder Gruppe:
df.withColumn("row_number", row_number().over(w))
Sie können dann den DataFrame filtern, um nur die obersten N Datensätze aus jeder Gruppe zu behalten, indem Sie dieselben Kriterien wie zuvor verwenden.
Das obige ist der detaillierte Inhalt vonWie erhalte ich die Top-N-Datensätze für jede Gruppe in einem Spark-DataFrame?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!