在pyspark中groupBy之后的列别名

mhn*_*mhn 21 python scala apache-spark apache-spark-sql pyspark

我需要在下面一行中得到的数据框,在groupBy之后的max('diff')列中有一个别名"maxDiff".但是,下面的行不做任何改变,也不会抛出错误.

 grpdf = joined_df.groupBy(temp1.datestamp).max('diff').alias("maxDiff")
Run Code Online (Sandbox Code Playgroud)

zer*_*323 53

您可以使用agg而不是调用max方法:

from pyspark.sql.functions import max

joined_df.groupBy(temp1.datestamp).agg(max("diff").alias("maxDiff"))
Run Code Online (Sandbox Code Playgroud)

同样在Scala中

import org.apache.spark.sql.functions.max

joined_df.groupBy($"datestamp").agg(max("diff").alias("maxDiff"))
Run Code Online (Sandbox Code Playgroud)

要么

joined_df.groupBy($"datestamp").agg(max("diff").as("maxDiff"))
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个接受的答案,因为它不需要事先知道Spark将给聚合列提供的名称. (3认同)

Nho*_*hor 26

这是因为你是整个DataFrame对象的别名,而不是Column.这是一个如何别名的例子Column:

import pyspark.sql.functions as func

grpdf = joined_df \
    .groupBy(temp1.datestamp) \
    .max('diff') \
    .select(func.col("max(diff)").alias("maxDiff"))
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经将`pyspark.sql.functions`导入到您的脚本中,那就不是了 (4认同)
  • 问题是您需要知道什么火花会触发新列,这可能并不明显。@zero323 的 anwser 更好 (2认同)

vk1*_*011 7

除了此处已有的答案外,如果您知道聚合列的名称,则以下也是方便的方法,您不必从中导入pyspark.sql.functions

1

grouped_df = joined_df.groupBy(temp1.datestamp) \
                      .max('diff') \
                      .selectExpr('max(diff) AS maxDiff')
Run Code Online (Sandbox Code Playgroud)

有关信息,请参阅文档.selectExpr()

2

grouped_df = joined_df.groupBy(temp1.datestamp) \
                      .max('diff') \
                      .withColumnRenamed('max(diff)', 'maxDiff')
Run Code Online (Sandbox Code Playgroud)

信息,文档.withColumnRenamed()

这里的答案更详细:https : //stackoverflow.com/a/34077809