Maison > base de données > tutoriel mysql > Comment récupérer les N principaux éléments par groupe d'utilisateurs dans un DataFrame Spark SQL à l'aide de Scala ?

Comment récupérer les N principaux éléments par groupe d'utilisateurs dans un DataFrame Spark SQL à l'aide de Scala ?

Linda Hamilton
Libérer: 2024-12-22 04:58:17
original
511 Les gens l'ont consulté

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

Génération de TopN pour les données groupées dans Spark SQL DataFrame

Problème :

Étant donné un DataFrame Spark SQL avec des colonnes représentant les utilisateurs , les éléments et les évaluations des utilisateurs, comment pouvons-nous regrouper par utilisateur, puis récupérer les N premiers éléments de chaque groupe en utilisant Scala ?

Réponse :

Pour y parvenir, nous pouvons utiliser la fonction de fenêtre de classement comme suit :

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)
Copier après la connexion

Plus de détails :

  • La fonction de classement attribue un classement à chaque élément au sein de chaque groupe d'utilisateurs, avec le l'élément le mieux noté recevant un rang de 1.
  • La spécification de la fenêtre w définit la portée du classement en partitionnant le DataFrame par utilisateur et en classant les données par ordre décroissant.
  • Le withRank DataFrame maintenant comprend une colonne « classement », qui peut être utilisée pour le filtrage.
  • Le topNPerUser DataFrame contient uniquement les N premiers éléments pour chaque utilisateur, en fonction de leur note.

Si vous préférez utiliser la fonction row_number, qui attribue des numéros de ligne séquentiels plutôt que des rangs (en ignorant les égalités), vous pouvez remplacer le rang par row_number dans la définition de la fenêtre :

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)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal