Pyspark 在从另一列中找到最大日期后生成一个数据框列,其中包含直到去年为止的所有月末日期的描述

Pyspark generate a dataframe column having description of all the month end dates till last year after finding the max date from another column

我有一个 date 列(整数类型)。我必须找到 date 的最大值,并生成一个描述列,其中包含截至上一年的日期的详细信息。

例如,该列的最大日期是 20181210,那么应该有一个包含 text 的列用于 current quarterprevious quartercurrent year 个月,并且 previous year个月。

date text
20180731 prev quarter
20180831 prev quarter
20180930 prev quarter
20181130 recent year
20181031 recent year
20180930 recent year
20180831 recent year
20180731 recent year
20180630 recent year
20180531 recent year
20180430 recent year
20180331 recent year
20180228 recent year
20180131 recent year
20171231 prev year
20171130 prev year
20171031 prev year
20170930 prev year
.. ..
.. ..

我尝试从 date 列中提取 yearmonthday,然后放置 if 条件。

还有其他更简单的方法吗?

您可以在 df 中获取最大日期并与原始数据框进行交叉连接,然后使用一些 when 表达式来设置描述列:

from pyspark.sql import functions as F

# convert date into date type
df = df.withColumn("date", F.to_date(F.col("date").cast("string"), "yyyyMMdd"))

max_date_df = df.agg(F.max("date").alias("max_date"))

result = df.crossJoin(max_date_df) \
    .withColumn(
    "text",
    F.when(
        F.year("date") < F.year("max_date"),
        F.lit("prev year")
    ).when(
        (F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date") - 1),
        F.lit("prev quarter")
    ).when(
        (F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date")),
        F.lit("current quarter")
    ).otherwise(F.lit("recent year"))
).select("date", "text")

result.show()

#+----------+---------------+
#|      date|           text|
#+----------+---------------+
#|2017-09-30|      prev year|
#|2017-10-31|      prev year|
#|2017-11-30|      prev year|
#|2018-01-31|    recent year|
#|2018-02-28|    recent year|
#|2018-03-31|    recent year|
#|2018-04-30|    recent year|
#|2018-05-31|    recent year|
#|2018-06-30|    recent year|
#|2018-07-31|   prev quarter|
#|2018-07-31|   prev quarter|
#|2018-08-31|   prev quarter|
#|2018-08-31|   prev quarter|
#|2018-09-30|   prev quarter|
#|2018-09-30|   prev quarter|
#|2018-09-30|   prev quarter|
#|2018-10-31|current quarter|
#|2018-10-31|current quarter|
#|2018-11-30|current quarter|
#|2018-11-30|current quarter|
#+----------+---------------+