【问题标题】:Apache SPark: groupby not working as expectedApache SPark:groupby 未按预期工作
【发布时间】:2020-06-15 14:35:10
【问题描述】:

df

  Date          Col1   COl2
  2010-01-01     23     28
  2012-09-01     50     70
  2010-03-04     80     10
  2012-04-01     19      20
  2012-03-05     67      9

  df_new=df.withColumn('year',year(df['Date']))

  Date          Col1   COl2   year
  2010-01-01     23     28    2010
  2012-09-01     50     70    2012   and so on

现在,我正在尝试找出每年 Col1 和 Col2 的最大值。所以我使用 groupby:

   df_new.groupby('year').max().show()

我得到的结果不是我所期望的。得到的结果

   year    max(year)
   2010    2010
   2012    2012   and so on

预期结果

    year    max(Col1)    max(Col2)
    2010     80            28
    2012     67             70

【问题讨论】:

  • 检查 Col1 和 Col2.. 的数据类型是什么?
  • 您可以使用.agg() 聚合多个列的值。谷歌可以提供进一步的帮助stackoverflow.com/questions/36251004/…
  • 这能回答你的问题吗? Pyspark - Aggregation on multiple columns
  • @anky right, max(*cols)[source] 计算每个组的每个 numeric 列的最大值。 如果 OP 尝试过df_new.groupby('year').max('Col1').show() 他们会得到“Col1 不是数字列”或类似的东西。
  • @mazaneicha 谢谢,那么可能还有另一个问题说 max 无法正常工作:)

标签: python apache-spark pyspark pyspark-dataframes


【解决方案1】:

检查下面的代码。

from pyspark.sql import functions as F

df.withColumn('year',F.year(df['date'])).groupBy("year").agg(F.max("col1").alias("max_col1"),F.max("col2").alias("max_col2")).show()

【讨论】:

  • 错误F未定义
  • 添加了导入,现在检查。
【解决方案2】:

你应该在Col1Col2上执行多个maxagg

from pyspark.sql import functions as F
df_new.groupBy(F.year("Date")).agg(F.max("Col1"),F.max("Col2"))
      .show()

【讨论】:

  • 乐于帮助@ShailajaGuptaKapoor
  • 这不能回答我的问题,因为我想按年分组。您的答案按日期分组,但仍然支持.....感谢您的帮助
  • 更新了ans以从日期列中提取年份@ShailajaGuptaKapoor
【解决方案3】:

如果您有一个庞大的数据集,最好在以下情况下使用 Window 函数,这比 groupBy 执行得更好

from pyspark.sql import functions as F
from pyspark.sql.window import Window as W
df = spark.table("test_poc")
df = df.withColumn("Year", F.year(F.col('date')))
_w = W.partitionBy(F.col('year'))
df = df.withColumn('max_col', F.max('id').over(_w)).withColumn('min_col', F.min('id').over(_w))
df.show()

---------输出------------

+---+-------------------+----+-------+-------+
| id|               date|Year|max_col|min_col|
+---+-------------------+----+-------+-------+
|  5|2019-12-31 23:26:59|2019|      5|      2|
|  2|2019-12-31 23:26:59|2019|      5|      2|
|  1|1969-12-31 23:26:59|1969|      3|      1|
|  2|1969-12-31 23:26:30|1969|      3|      1|
|  3|1969-12-31 23:26:26|1969|      3|      1|
|  4|2020-12-31 23:26:59|2020|      4|      1|
|  1|2020-12-31 23:26:59|2020|      4|      1|
+---+-------------------+----+-------+-------+

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2016-03-31
    • 2013-07-24
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多