Python 3.x Pyspark从另一列中找到最大日期后,生成一个数据框列,该列描述了截至去年的所有月末日期

Python 3.x Pyspark从另一列中找到最大日期后,生成一个数据框列,该列描述了截至去年的所有月末日期,python-3.x,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Python 3.x,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有一个date列(整数类型)。我必须找到日期的最大值,并生成一个描述列,其中包含上一年的详细日期 例如,该列的最大日期为20181210,那么应该有一个列,其中包含当前季度、上一季度、当前年度月份和上一年度月份的文本 日期 文本 20180731 上季度 20180831 上季度 20180930 上季度 20181130 近几年 20181031 近几年 20180930 近几年 20180831 近几年 20180731 近几年 20180630 近几年 20180531 近几年 2018

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

例如,该列的最大日期为20181210,那么应该有一个列,其中包含
当前季度
上一季度
当前年度
月份和
上一年度
月份的
文本

日期 文本 20180731 上季度 20180831 上季度 20180930 上季度 20181130 近几年 20181031 近几年 20180930 近几年 20180831 近几年 20180731 近几年 20180630 近几年 20180531 近几年 20180430 近几年 20180331 近几年 20180228 近几年 20180131 近几年 20171231 上一年 20171130 上一年 20171031 上一年 20170930 上一年 .. .. .. ..
您可以获取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|
#+----------+---------------+
从pyspark.sql导入函数为F
#将日期转换为日期类型
df=df.withColumn(“date”,F.to_date(F.col(“date”).cast(“string”),“yyyyMMdd”))
max_date_df=df.agg(F.max(“日期”)。别名(“max_date”))
结果=df.交叉连接(最大日期)\
.withColumn(
“文本”,
F.什么时候(
F年(“日期”)