Heim >Datenbank >MySQL-Tutorial >Wie rufe ich mit Scala die Top-N-Elemente pro Benutzergruppe in einem Spark SQL DataFrame ab?

Wie rufe ich mit Scala die Top-N-Elemente pro Benutzergruppe in einem Spark SQL DataFrame ab?

Linda Hamilton
Linda HamiltonOriginal
2024-12-22 04:58:17473Durchsuche

How to Retrieve Top N Items per User Group in a Spark SQL DataFrame using Scala?

TopN für gruppierte Daten im Spark SQL DataFrame generieren

Problem:

Gegeben ist ein Spark SQL DataFrame mit Spalten, die Benutzer darstellen , Artikel und Benutzerbewertungen, wie können wir nach Benutzer gruppieren und dann die Top-N-Artikel für jede Gruppe abrufen? Scala?

Antwort:

Um dies zu erreichen, können wir die Rangfensterfunktion wie folgt nutzen:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.{rank, desc}

val n: Int = ???

// Define the window specification
val w = Window.partitionBy($"user").orderBy(desc("rating"))

// Calculate the rank for each item
val withRank = df.withColumn("rank", rank.over(w))

// Filter to retain only the top N items
val topNPerUser = withRank.where($"rank" <= n)

Weitere Details :

  • Die Rangfunktion weist jedem Element innerhalb jeder Benutzergruppe einen Rang zu, mit dem Das am höchsten bewertete Element erhält einen Rang von 1.
  • Die w-Fensterspezifikation definiert den Umfang des Rankings, indem sie den DataFrame nach Benutzer partitioniert und die Daten absteigend nach Bewertung sortiert.
  • Der withRank-DataFrame jetzt Enthält eine „Rang“-Spalte, die zum Filtern verwendet werden kann.
  • Der topNPerUser DataFrame enthält nur die Top-N-Elemente für jeden Benutzer, basierend auf ihrem Bewertung.

Wenn Sie lieber die Funktion row_number verwenden möchten, die fortlaufende Zeilennummern anstelle von Rängen zuweist (Gleichstände ignorieren), können Sie rank durch row_number in der Fensterdefinition ersetzen:

val w = Window.partitionBy($"user").orderBy(desc("rating"))

val withRowNumber = df.withColumn("row_number", row_number.over(w))

val topNPerUser = withRowNumber.where($"row_number" <= n)

Das obige ist der detaillierte Inhalt vonWie rufe ich mit Scala die Top-N-Elemente pro Benutzergruppe in einem Spark SQL DataFrame ab?. 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