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
470 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!

source:php.cn
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