季度的最后一天

i7uq4tfw  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(317)

有没有一种方法可以在pyspark中本地选择每个季度的最后一天?例如,在 df 包含两列- yyyy_mm_dd 以及 sum . 我怎么回来 sum 每季度的最后一天?对于当前/进行中的季度,最好显示最大日期。
我看了这个解决方案,用python获取当前季度的第一个日期和最后一个日期?它是有效的,但是我想知道是否有一个使用pyspark语法而不是udf的解决方案?

toe95027

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 编辑:我可能误解了这个问题。您可以在季度使用分组方式并选择每个季度的最后一行来尝试此方法:

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 ,应该是每个季度的最后一天。

z6psavjg

z6psavjg2#

您希望消除重复数据并保留每个季度中存在的最大日期。你可以用 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")

相关问题