Heim >Datenbank >MySQL-Tutorial >Wie erhalte ich die Top-N-Datensätze für jede Gruppe in einem Spark-DataFrame?

Wie erhalte ich die Top-N-Datensätze für jede Gruppe in einem Spark-DataFrame?

DDD
DDDOriginal
2024-12-23 11:46:36438Durchsuche

How to Get the Top N Records for Each Group in a 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:

  1. Definieren Sie den oberen N-Wert:

    val n: Int = ???
  2. 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"))
  3. Rang hinzufügen Spalte zum DataFrame mithilfe der Rangfunktion:

    df.withColumn("rank", rank().over(w))
  4. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn