有没有办法在 PySpark 中本地选择每个季度的最后一天?例如,在包含两列的
df
中 - yyyy_mm_dd
和 sum
。我如何返回每个季度最后一天的 sum
?对于当前/正在进行的季度,最好显示最大日期。
我查看了这个解决方案Get First Date and Last Date of Current Quarter in Python?并且它有效,但是我想知道是否有使用 PySpark 语法而不是 udf 的解决方案?
使用与此答案类似的方法:
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
的行
编辑:我可能误解了这个问题。您可以尝试这种方法,在季度上使用 group by 并选择每个季度的最后一行:
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
过滤行,这应该是每个季度的最后一天。
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")