有没有一种方法可以在pyspark中本地选择每个季度的最后一天?例如,在 df 包含两列- yyyy_mm_dd 以及 sum . 我怎么回来 sum 每季度的最后一天?对于当前/进行中的季度,最好显示最大日期。我看了这个解决方案,用python获取当前季度的第一个日期和最后一个日期?它是有效的,但是我想知道是否有一个使用pyspark语法而不是udf的解决方案?
df
yyyy_mm_dd
sum
toe950271#
使用与此答案类似的方法:
df2 = df.withColumn( 'last_day', F.expr(""" to_date( date_trunc('quarter', to_date(input_date) + interval 3 months) ) - interval 1 day """) ) df2.show() +----------+----------+ |input_date| last_day| +----------+----------+ |2020-01-21|2020-03-31| |2020-02-06|2020-03-31| |2020-04-15|2020-06-30| |2020-07-10|2020-09-30| |2020-10-20|2020-12-31| |2021-02-04|2021-03-31| +----------+----------+
然后可以过滤其中的行 input_date == last_day 编辑:我可能误解了这个问题。您可以在季度使用分组方式并选择每个季度的最后一行来尝试此方法:
input_date == last_day
from pyspark.sql import functions as F, Window df2 = df.withColumn( 'rn', F.row_number().over(Window.partitionBy(F.year('input_date'), F.quarter('input_date')).orderBy(F.desc('input_date'))) ) df2.show() +----------+---+ |input_date| rn| +----------+---+ |2021-02-04| 1| |2020-10-20| 1| |2020-07-10| 1| |2020-02-06| 1| |2020-01-21| 2| |2020-04-15| 1| +----------+---+
并用 rn = 1 ,应该是每个季度的最后一天。
rn = 1
z6psavjg2#
您希望消除重复数据并保留每个季度中存在的最大日期。你可以用 trunc 带窗口功能:
trunc
from pyspark.sql import Window from pyspark.sql import functions as F w = Window.partitionBy(F.trunc('date_col', 'quarter')).orderBy(F.col('date_col').desc()) df1 = df.withColumn("rn", F.row_number().over(w)) \ .filter("rn = 1") \ .drop("rn")
2条答案
按热度按时间toe950271#
使用与此答案类似的方法:
然后可以过滤其中的行
input_date == last_day
编辑:我可能误解了这个问题。您可以在季度使用分组方式并选择每个季度的最后一行来尝试此方法:并用
rn = 1
,应该是每个季度的最后一天。z6psavjg2#
您希望消除重复数据并保留每个季度中存在的最大日期。你可以用
trunc
带窗口功能: