2015-11-04 119 views
11

我需要下面一行中的结果数据框,为groupBy之后的max('diff')列创建别名“maxDiff”。但是,下面的行不会改变,也不会抛出错误。pyspark中的groupBy之后的列别名

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

回答

12

这是因为你走样整个DataFrame对象,而不是Column。下面是一个例子如何别名Column只:

import pyspark.sql.functions as func 

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

是的..这个工程..除了func。不是必需的 – mhn

+1

这不是如果你已经将'pyspark.sql.functions'导入你的脚本 – Nhor

25

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

from pyspark.sql.functions import max 

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

我更喜欢这个接受的答案,因为它不需要提前知道Spark将给予聚合列的名字。 – abeboparebop

0

除了答案已经在这里,下面也方便的方式,如果你知道集合列,在这里你不必从pyspark.sql.functions进口的名字:

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

的信息,请参阅docs.selectExpr()

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

docs的信息上.withColumnRenamed()

这里这个答案进入更多细节:https://stackoverflow.com/a/34077809

+0

**你有没有尝试第一个代码块?**这似乎是错误的。 Spark无法用提到的方式解析列名。在你的代码块中,spark试着找到** diff **列并尝试运行给定set上的** max **函数,但是grouped_data不包含任何** diff **列,它包含** temp1.datestamp和MAX(DIFF)**。 –