#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.