преобразование 12 — часовых часов в 24-часовое время в sparklyr

#python #r #apache-spark #pyspark #sparklyr

Вопрос:

Я пытаюсь преобразовать следующее в 24-часовое время с помощью sparklyr:

 2021-05-18 9:00:00 PM
 

Мой ожидаемый результат: 2021-05-18 21:00:00

Я пытался:

 data %>% 
  mutate(datetime_24 = to_timestamp("datetime_12", "yyyy-MM-dd hh:mm:ss"))

data %>% 
  mutate(datetime_24 = to_date("datetime_12", "yyyy-MM-dd hh:mm:ss"))
 

И то, и другое приводит к нулю.

Я попробовал следующее в качестве отправной точки и получил эту ошибку

 data %>%
  mutate(datetime_24 = unix_timestamp(datetime_12, "yyyy-MM-dd hh:mm:ss"))
 

Вы можете получить другой результат из-за обновления Spark 3.0: Не удалось
проанализировать «2021-05-18 9:00:00 вечера» в новом анализаторе. Вы можете установить
spark.sql.legacy.timeParserPolicy в значение LEGACY, чтобы восстановить поведение
до Spark 3.0, или установить значение ИСПРАВЛЕНО и рассматривать его как недопустимую
строку даты и времени.

Я также попробовал следующее в pyspark, но получил аналогичную ошибку:

 from pyspark.sql.functions import from_unixtime, unix_timestamp, col

df_time = spark.table("data")

df_time_new = df_time.withColumn('datetime_24', 
             from_unixtime(unix_timestamp(col(('datetime_12')), "yyyy-mm-dd hh:mm:ss"), "yyyy-mm-dd HH:mm:ss"))
 

Ошибка:

Вы можете получить другой результат из-за обновления Spark 3.0: Не удалось проанализировать «2021-05-18 9:00:00 вечера» в новом анализаторе. Вы можете установить spark.sql.legacy.timeParserPolicy в значение LEGACY, чтобы восстановить поведение до Spark 3.0, или установить значение ИСПРАВЛЕНО и рассматривать его как недопустимую строку даты и времени. Вызвано: Исключение DateTimeParseException: Текст ‘2021-05-18 9:00:00 вечера’ не удалось проанализировать по индексу 11

Ответ №1:

Вы можете установить spark.sql.legacy.timeParserPolicy в значение LEGACY, как показано ниже:

 spark.conf.set("spark.sql.legacy.timeParserPolicy","LEGACY")
 

После этого вы не должны получать ошибку при анализе даты и времени.

Поскольку в spark v3.0 есть некоторые изменения, связанные с анализатором даты и времени (читайте здесь), вы получаете эту ошибку.

Прочитайте шаблоны времени и даты здесь. В соответствии с этим вы можете использовать шаблон » a » для анализа PM или AM.

 to_date("datetime_12", "yyyy-MM-dd hh:mm:ss a")
 

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

1. Спасибо, это работает, но знаете ли вы, какова правильная спецификация для новой spark 3.0?

2. Обновил ответ, пожалуйста, проверьте.