Obtenir TopN pour chaque groupe dans un DataFrame
Dans Spark DataFrame, nous devons souvent regrouper les données par une certaine colonne et récupérer le haut N enregistrements de chaque groupe. Par exemple, vous disposez d'un DataFrame avec des données d'évaluation des éléments utilisateur et vous souhaitez trouver les éléments les mieux notés pour chaque utilisateur.
Solution Scala
La Scala La solution à ce problème consiste à utiliser une fonction de fenêtre de classement. Voici comment procéder :
Définissez la valeur N supérieure :
val n: Int = ???
Créez une définition de fenêtre pour partitionner les données par l'utilisateur colonne et classez les enregistrements par ordre décroissant de leur note :
val w = Window.partitionBy($"user").orderBy(desc("rating"))
Ajouter le classement colonne au DataFrame à l'aide de la fonction de classement :
df.withColumn("rank", rank().over(w))
Filtrez le DataFrame pour conserver uniquement les N premiers enregistrements de chaque groupe :
df.where($"rank" <= n)
Alternative avec numéro de ligne
Si vous n'avez pas besoin de rompre les égalités, vous peut utiliser la fonction row_number au lieu de la fonction Rank. Cela vous donnera un numéro de ligne unique pour chaque enregistrement de chaque groupe :
df.withColumn("row_number", row_number().over(w))
Vous pourrez ensuite filtrer le DataFrame pour conserver uniquement les N premiers enregistrements de chaque groupe en utilisant les mêmes critères qu'auparavant.
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!