获取Pyspark中的max(datetime)

ehxuflar  于 2023-08-02  发布在  Spark
关注(0)|答案(3)|浏览(163)

我有一个这样的数据集:
| 日期时间|价值| value |
| --|--| ------------ |
| 日期1|十个| 10 |
| 日期2|三十| 30 |
| 日期3|二十个| 20 |
| 日期4| 50人| 50 |
| 约会5|三十| 30 |
| 约会6|二十个| 20 |
| 约会7|十五个| 15 |
| 约会8|三十| 30 |
| 约会9|四十| 40 |
| 约会10|十个| 10 |
| 约会11|十个| 10 |
| 约会12|三十| 30 |
我想为每个categoy获取max(value)的日期时间
在这个例子中,我想得到这个:
| 日期时间|价值|最大日期| datetimeMax |
| --|--|--| ------------ |
| 日期1|十个|日期4| date4 |
| 日期2|三十|日期4| date4 |
| 日期3|二十个|日期4| date4 |
| 日期4| 50人|日期4| date4 |
| 约会5|三十|日期4| date4 |
| 约会6|二十个|约会9| date9 |
| 约会7|十五个|约会9| date9 |
| 约会8|三十|约会9| date9 |
| 约会9|四十|约会9| date9 |
| 约会10|十个|约会12| date12 |
| 约会11|十个|约会12| date12 |
| 约会12|三十|约会12| date12 |
提前感谢!

b09cbbtk

b09cbbtk1#

pyspark >= 3.3.0中使用MAX_BY

from pyspark.sql.window import Window
from pyspark.sql import functions as F

w = (
    Window
    .partitionBy('category')
    .rangeBetween(Window.unboundedPreceding, Window.unboundedFollowing)
)
mdt = F.max_by('datetime', 'value').over(w)
df2 = df.withColumn('datetime_max', mdt)

字符串

kpbwa7wx

kpbwa7wx2#

from pyspark.sql.functions import max

df = df.join(
    df.groupby('category'). \
    agg(max('value').alias('datetimeMax')), \
    on=['category'])
df.show()

字符串

cfh9epnr

cfh9epnr3#

在这种情况下使用window函数(row_number,max),通过在category上定义分区by,并在value上降序排序by。

  • when(row_number().over(w) == 1,->当row_number=1时,获取datetime值,否则保留为null
  • max(when(row_number().over(w) == 1,col("datetime")))->获取窗口的最大值并填充所有行
    Example:
from pyspark.sql import Window
from pyspark.sql.functions import *

w = Window.partitionBy('category').orderBy(desc('value'))

w = Window.partitionBy('category').orderBy(desc('value'))

df.withColumn("datetimeMax",max(when(row_number().over(w) == 1,col("datetime"))).over(w)).show(100,False)

#+--------+--------+-----+-----------+
#|category|datetime|value|datetimeMax|
#+--------+--------+-----+-----------+
#|a       |date4   |50   |date4      |
#|a       |date2   |30   |date4      |
#|a       |date5   |30   |date4      |
#|a       |date3   |20   |date4      |
#|a       |date1   |10   |date4      |
#+--------+--------+-----+-----------+

字符串

相关问题