web-dev-qa-db-fra.com

Alias ​​de colonne après groupBy dans pyspark

J'ai besoin du bloc de données résultant dans la ligne ci-dessous, pour avoir un nom d'alias "maxDiff" pour la colonne max ('diff') après groupBy. Cependant, la ligne ci-dessous ne change rien et ne renvoie pas d'erreur.

 grpdf = joined_df.groupBy(temp1.datestamp).max('diff').alias("maxDiff")
20
mhn

Cela est dû au fait que vous aliasez l'ensemble de l'objet DataFrame, pas Column. Voici un exemple d'alias uniquement pour le Column:

import pyspark.sql.functions as func

grpdf = joined_df \
    .groupBy(temp1.datestamp) \
    .max('diff') \
    .select(func.col("max(diff)").alias("maxDiff"))
25
Nhor

Vous pouvez utiliser agg au lieu d'appeler la méthode max:

from pyspark.sql.functions import max

joined_df.groupBy(temp1.datestamp).agg(max("diff").alias("maxDiff"))

De même à Scala

import org.Apache.spark.sql.functions.max

joined_df.groupBy($"datestamp").agg(max("diff").alias("maxDiff"))

ou

joined_df.groupBy($"datestamp").agg(max("diff").as("maxDiff"))
52
zero323

En plus des réponses déjà ici, les méthodes suivantes sont également pratiques si vous connaissez le nom de la colonne agrégée, où vous n'avez pas besoin d'importer depuis pyspark.sql.functions:

1

grouped_df = joined_df.groupBy(temp1.datestamp) \
                      .max('diff') \
                      .selectExpr('max(diff) AS maxDiff')

Voir docs pour plus d'informations sur .selectExpr()

2

grouped_df = joined_df.groupBy(temp1.datestamp) \
                      .max('diff') \
                      .withColumnRenamed('max(diff)', 'maxDiff')

Voir docs pour plus d'informations sur .withColumnRenamed()

Cette réponse va ici plus en détail: https://stackoverflow.com/a/34077809

1
vk1011