Apache SPark:groupby 未按预期工作
Apache SPark: groupby not working as expected
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
检查下面的代码。
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()
您应该在 Col1
和 Col2
上执行多个 max
、 agg
from pyspark.sql import functions as F
df_new.groupBy(F.year("Date")).agg(F.max("Col1"),F.max("Col2"))
.show()
如果你有一个庞大的数据集,在下面的情况下最好使用 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|
+---+-------------------+----+-------+-------+
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
检查下面的代码。
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()
您应该在 Col1
和 Col2
max
、 agg
from pyspark.sql import functions as F
df_new.groupBy(F.year("Date")).agg(F.max("Col1"),F.max("Col2"))
.show()
如果你有一个庞大的数据集,在下面的情况下最好使用 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|
+---+-------------------+----+-------+-------+