Maison >base de données >tutoriel mysql >Comment conserver les colonnes non agrégées après un Spark DataFrame GroupBy ?

Comment conserver les colonnes non agrégées après un Spark DataFrame GroupBy ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-31 14:33:11359parcourir

How to Keep Non-Aggregated Columns After a Spark DataFrame GroupBy?

Comment conserver les colonnes non agrégées dans Spark DataFrame GroupBy

Lors de l'agrégation de données à l'aide de la méthode groupBy de DataFrame, le DataFrame résultant contient uniquement le groupe -par clé et les valeurs agrégées. Cependant, dans certains cas, il peut être souhaitable d'inclure également des colonnes non agrégées du DataFrame d'origine dans le résultat.

Limitation de Spark SQL

Spark SQL suit la convention du SQL antérieur à 1999, qui n'autorise pas de colonnes supplémentaires dans les requêtes d'agrégation. Les agrégations telles que count produisent des résultats qui ne sont pas bien définis lorsqu'elles sont appliquées à plusieurs colonnes, de sorte que différents systèmes traitant de telles requêtes présentent des comportements variables.

Solution :

Pour préserver non -colonnes agrégées dans un groupe Spark DataFrame, il existe plusieurs options :

  1. Rejoindre l'original DataFrame : Joignez le DataFrame agrégé au DataFrame d'origine pour ajouter les colonnes manquantes.
val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count"))
val joinedDf = aggregatedDf.join(df, Seq("age"), "left")
  1. Utiliser les fonctions de fenêtre : Utilisez les fonctions de fenêtre comme first ou dernier à inclure des colonnes supplémentaires dans la requête d'agrégation. Cependant, cette approche peut être coûteuse en calcul dans certains scénarios.
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy(df("age"))
val aggregatedDf = df.withColumn("name", first(df("name")).over(windowSpec))
  .groupBy(df("age")).agg(Map("id" -> "count"))

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