Maison >base de données >tutoriel mysql >Comment obtenir les N premiers éléments par groupe dans un Spark DataFrame ?

Comment obtenir les N premiers éléments par groupe dans un Spark DataFrame ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 01:57:15403parcourir

How to Get the Top N Items per Group in a Spark DataFrame?

Obtenir les N principaux éléments par groupe à l'aide de Spark DataFrame GroupBy

Dans les opérations Spark DataFrame, vous pouvez rencontrer le besoin de regrouper les données par une colonne spécifique et de récupérer les N premiers éléments au sein de chaque groupe. Cet article montre comment y parvenir en utilisant Scala, en s'inspirant d'un exemple Python.

Considérez le DataFrame fourni :

user1 item1 rating1
user1 item2 rating2
user1 item3 rating3
user2 item1 rating4
...

Solution Scala

Pour récupérer les N premiers éléments pour chaque groupe d'utilisateurs, vous pouvez exploiter une fonction de fenêtre en conjonction avec les opérations orderBy et Where. Voici la mise en œuvre :

// Import required functions and classes
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.{rank, desc}

// Specify the number of desired top N items
val n: Int = ???

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

// Calculate the rank within each group using the rank function
val rankedDF = df.withColumn("rank", rank.over(w))

// Filter the DataFrame to select only the top N items
val topNDF = rankedDF.where($"rank" <= n)

Option alternative

Si les égalités ne sont pas un problème, vous pouvez remplacer le rang par row_number :

val topNDF = rankedDF.withColumn("row_num", row_number.over(w)).where($"row_num" <= n)

En utilisant cette approche, vous peut récupérer efficacement les N principaux éléments pour chaque groupe d'utilisateurs de votre DataFrame.

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:
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