从列中获取最大值,并与列中的每个项目进行比较



我有一个数据帧,例如:

id | value | date1       | date2
-------------------------------------
1  | 20    | 2015-09-01  | 2018-03-01 
1  | 30    | 2019-04-04  | 2015-03-02 
1  | 40    | 2014-01-01  | 2016-06-09 
2  | 15    | 2014-01-01  | 2013-06-01 
2  | 25    | 2019-07-18  | 2016-07-07 

并希望为该iddate1<max(date2)的每个id返回sum(value).在上面的例子中,我们将得到:

id | sum_value 
-----------
1  | 60     
2  | 15 

由于对于id1,max(date2)2018-03-01的,第一行和第三行符合条件date1<max(date2),因此该值是2040的总和。

我已经尝试了下面的代码,但我们不能在agg函数之外使用max

df.withColumn('sum_value',F.when(F.col('date1')<F.max(F.col('date2')), value).otherwise(0))
.groupby(['id']) 

你有什么建议吗?该表有 20 亿行,所以我正在寻找重新加入以外的其他选项。

您可以使用Window函数。直接翻译您的要求将是:

from pyspark.sql.functions import col, max as _max, sum as _sum
from pyspark.sql import Window
df.withColumn("max_date2", _max("date2").over(Window.partitionBy("id")))
.where(col("date1") < col("max_date2"))
.groupBy("id")
.agg(_sum("value").alias("sum_value"))
.show()
#+---+---------+
#| id|sum_value|
#+---+---------+
#|  1|     60.0|
#|  2|     15.0|
#+---+---------+

最新更新