获取Pyspark中的最大日期时间。

huangapple go评论65阅读模式
英文:

Get the max(datetime) in Pyspark

问题

我有一个数据集,类似这样:

分类 日期时间
a 日期1 10
a 日期2 30
a 日期3 20
a 日期4 50
a 日期5 30
b 日期6 20
b 日期7 15
b 日期8 30
b 日期9 40
c 日期10 10
c 日期11 10
c 日期12 30

我想要为每个分类获取最大值的日期时间,就像这样:

分类 日期时间 最大日期时间
a 日期1 10 日期4
a 日期2 30 日期4
a 日期3 20 日期4
a 日期4 50 日期4
a 日期5 30 日期4
b 日期6 20 日期9
b 日期7 15 日期9
b 日期8 30 日期9
b 日期9 40 日期9
c 日期10 10 日期12
c 日期11 10 日期12
c 日期12 30 日期12

提前感谢!

英文:

I have a dataset like this :

category datetime value
a date1 10
a date2 30
a date3 20
a date4 50
a date5 30
b date6 20
b date7 15
b date8 30
b date9 40
c date10 10
c date11 10
c date12 30

And I want to get for each categoy the datetime of the max(value)

In this example I want to get this :

category datetime value datetimeMax
a date1 10 date4
a date2 30 date4
a date3 20 date4
a date4 50 date4
a date5 30 date4
b date6 20 date9
b date7 15 date9
b date8 30 date9
b date9 40 date9
c date10 10 date12
c date11 10 date12
c date12 30 date12

Thanks in advance !

答案1

得分: 1

使用MAX_BYpyspark >= 3.3.0中:

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)
英文:

Using MAX_BY in pyspark >= 3.3.0

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)

答案2

得分: 0

from pyspark.sql.functions import max

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

英文:
from pyspark.sql.functions import max

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

答案3

得分: 0

使用窗口函数(row_numbermax)来处理这个情况,通过在category上定义分区并按value降序排序。

  • when(row_number().over(w) == 1, -> 当row_number等于1时,获取日期时间值,否则保留为null
  • max(when(row_number().over(w) == 1, col("datetime"))) -> 获取窗口中的最大值,并在所有行上填充

示例:

from pyspark.sql import Window
from pyspark.sql.functions import *

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      |
# +--------+--------+-----+-----------+

(注意:上述示例是使用PySpark编写的代码,用于处理数据集中的窗口函数操作。)

英文:

Use window functions(row_number,max) for this case, by defining the partition by on category and order by on value descending.

  • when(row_number().over(w) == 1, -> when row_number=1 then get datetime value otherwise keep as null
  • max(when(row_number().over(w) == 1,col("datetime"))) -> get max value for the window and populate on all rows

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      |
#+--------+--------+-----+-----------+

huangapple
  • 本文由 发表于 2023年7月20日 22:33:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/76730973.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定