Ошибка PySpark при форматировании даты в столбце

#apache-spark #pyspark

#apache-spark #pyspark

Вопрос:

Я обнаружил любопытную ошибку в функции PySpark «to_date»

 from pyspark.sql.functions import to_date, col
from datetime import date

df = spark.createDataFrame([(date(2020,12,26),)], ['t'])
df1 = df.select(to_date(df.t, 'yyyy-MM-dd').alias('dt')).withColumn('fn1',cfg.date_format(col('dt'),'YYYYMMdd'))
df1.show()
 

Это приводит к следующему результату:

введите описание изображения здесь

Но если вы используете тот же код для даты, которая на один день позже,

 from pyspark.sql.functions import to_date, col
from datetime import date

df = spark.createDataFrame([(date(2020,12,27),)], ['t'])
df1 = df.select(to_date(df.t, 'yyyy-MM-dd').alias('dt')).withColumn('fn1',cfg.date_format(col('dt'),'YYYYMMdd'))
df1.show()
 

Вы получите:

введите описание изображения здесь

То же самое касается дат после 2020-12-27, но никогда для дат до 2020-12-25.

Комментарии:

1. yyyy это не то же самое, что YYYY — похоже, вы используете неправильный формат

Ответ №1:

Y означает год недели (год, основанный на неделе ISO), в то время y как означает обычный год. 2020-12-27 относится к 1-й неделе ISO 2021 года, поэтому при использовании вы получите 2021 Y год. Я думаю, вы хотели использовать y в своей date_format функции.

Обратите внимание, что шаблоны даты и времени на основе недель (такие как y и w ) устарели в Spark 3.