Maison >base de données >tutoriel mysql >Comment obtenir les N premiers enregistrements pour chaque groupe dans un Spark DataFrame ?

Comment obtenir les N premiers enregistrements pour chaque groupe dans un Spark DataFrame ?

DDD
DDDoriginal
2024-12-23 11:46:36481parcourir

How to Get the Top N Records for Each Group in a Spark DataFrame?

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 :

  1. Définissez la valeur N supérieure :

    val n: Int = ???
  2. 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"))
  3. Ajouter le classement colonne au DataFrame à l'aide de la fonction de classement :

    df.withColumn("rank", rank().over(w))
  4. 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!

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