Согласно документации на date_format
:
«Можно использовать все буквы шаблона класса Java java.text.SimpleDateFormat»
и если вы посмотрите в документации по Java, например. java.text.SimpleDateFormat , вы можете видеть, что в верхнем регистре Y обозначает год недели , а не сам год как строчный y.
С большим количеством лет, чем в вашем примере:
dftest = spark.createDataFrame([('20{}-12-31'.format(i),) for i in range(19, 25)], ['dt'])
dftest.select('dt', date_format('dt', 'MM/dd/yyyy').alias('date'),
date_format('dt', 'MM/dd/YYYY').alias('DATE'),).show()
+----------+----------+----------+
| dt| date| DATE|
+----------+----------+----------+
|2019-12-31|12/31/2019|12/31/2020|
|2020-12-31|12/31/2020|12/31/2021|
|2021-12-31|12/31/2021|12/31/2022|
|2022-12-31|12/31/2022|12/31/2022| # this one is good for both
|2023-12-31|12/31/2023|12/31/2024|
|2024-12-31|12/31/2024|12/31/2025|
+----------+----------+----------+
Вы можете видеть, что 2022 год хорош, и год заканчивается в субботу. Если вы попробуете больше лет, вы найдете тот же результат, когда они закончатся в субботу. Таким образом, я предполагаю (не совсем уверен), что когда вы используете заглавные буквы Y, синтаксический анализ переходит к следующей субботе и получает год, связанный с этой субботой. Для 2019 года, так как это вторник, он переходит к субботе 4 января 2020 года и получает этот год вместо 2019.