PySpark 序列间隔月中的月序列错误

Wrong sequence of months in PySpark sequence interval month

我正在尝试创建一个日期数组,其中包含从最小日期到最大日期的所有月份!

示例:

min_date = "2021-05-31"
max_date = "2021-11-30"

.withColumn('array_date', F.expr('sequence(to_date(min_date), to_date(max_date), interval 1 month)')

但它给了我以下输出:

['2021-05-31', '2021-06-30', '2021-07-31', '2021-08-31', '2021-09-30', '2021-10-31']

为什么11/30/2021上没有出现上限?在文档中,它说包含了极端值。

我想要的输出是:

['2021-05-31', '2021-06-30', '2021-07-31', '2021-08-31', '2021-09-30', '2021-10-31', '2021-11-30']

谢谢!

我认为这与时区有关。我可以在我的时区 Europe/Paris 中重现相同的行为,但是当将时区设置为 UTC 时,它给出了预期的结果:

from pyspark.sql import functions as F

spark.conf.set("spark.sql.session.timeZone", "UTC")

df = spark.createDataFrame([("2021-05-31", "2021-11-30")], ["min_date", "max_date"])

df.withColumn(
    "array_date",
    F.expr("sequence(to_date(min_date), to_date(max_date), interval 1 month)")
).show(truncate=False)

#+----------+----------+------------------------------------------------------------------------------------+
#|min_date  |max_date  |array_date                                                                          |
#+----------+----------+------------------------------------------------------------------------------------+
#|2021-05-31|2021-11-30|[2021-05-31, 2021-06-30, 2021-07-31, 2021-08-31, 2021-09-30, 2021-10-31, 2021-11-30]|
#+----------+----------+------------------------------------------------------------------------------------+

或者,您可以使用 TimestampType 作为序列的开始和结束参数,而不是 DateType:

df.withColumn(
    "array_date",
    F.expr("sequence(to_timestamp(min_date), to_timestamp(max_date), interval 1 month)").cast("array<date>")
).show(truncate=False)