Функция pyspark date_format возвращает неверный год - PullRequest
1 голос
/ 21 июня 2019

pyspark.sql.functions.date_format - возвращает неверный год для последнего дня года

Версия Pyspark: версия 2.3.0.cloudera3 Версия Python: Python 2.7.5

Когда япопробуйте переформатировать последнюю дату года, используя функцию date_format в pyspark, она возвращает следующий год при использовании с «YYYY» вместо «yyyy».

>>> from pyspark.sql.functions import *

>>> dftest = spark.createDataFrame([('2017-12-31',)], ['dt'])

>>> dftest.select(date_format('dt', 'MM/dd/yyy').alias('date')).collect()
[Row(date=u'12/31/2017')]
>>> dftest.select(date_format('dt', 'MM/dd/yyyy').alias('date')).collect()
[Row(date=u'12/31/2017')]

>>> dftest.select(date_format('dt', 'MM/dd/YYY').alias('date')).collect()
[Row(date=u'12/31/2018')]
>>> dftest.select(date_format('dt', 'MM/dd/YYYY').alias('date')).collect()
[Row(date=u'12/31/2018')]

Чем «ГГГГ» (в верхнем регистре) отличается от «ГГГГ» (в нижнем регистре)?

1 Ответ

2 голосов
/ 21 июня 2019

Согласно документации на 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.

...