Pyspark преобразует строку в метку времени в формате UTC [Получение нулевого значения]

Я новичок в pyspark и Spark SQL. У меня есть фрейм данных с одним столбцом, имеющим значения даты и времени в строке, которые мне нужно преобразовать / преобразовать в метку времени.

Формат фрейма данных:

+--------------------+------------------------------+
|               value|                time_from_text|
+--------------------+------------------------------+
|dummy               |2020-04-19T23:49:52.020000453Z|
|dummy               |2020-04-22T23:52:52.020000453Z|
+--------------------+------------------------------+

Теперь я просмотрел этот пост и попробовал следующий фрагмент кода:

result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'").cast(TimestampType()))

Это сработало в моем предыдущем случае, когда моя версия Spark была 3.1.1. Однако мне нужно было вернуться к 2.4.6, и здесь тот же код дает мне null в качестве вывода для метки времени!

Я пробовал много разных способов, но не могу применить метку времени.

Любые указатели будут оценены. Спасибо за помощь!


person phoenix007    schedule 30.04.2021    source источник


Ответы (1)


Это не идеальный ответ, но я нашел быстрое решение, чтобы выполнить преобразование. Каким-то образом преобразование происходит в формате гггг-ММ-дд'T'ЧЧ: мм: сс. Итак, я усек столбец time_from_text, чтобы потерять точность в несколько секунд [что нормально для случая использования здесь], а затем выполнил преобразование в метку времени.

Фрагмент кода:

result = result.withColumn("time_from_text", substring(col("time_from_text"),0,19))
final_result = result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss").cast(TimestampType())).orderBy("Timestamp")

Причина:

Я провел небольшое исследование и, как мне кажется, во время обновления Spark SQL 3.0 до 3.1 были внесены некоторые изменения в кодовую базу unix_timestamp. Следовательно, формат 2020-04-19T23: 49: 52.020000453Z поддерживается в новых версиях, но не в старых, которые были реализованы через DateTimeFormatter под капотом. Кроме того, более старые версии приводили к нулевому значению для недопустимых шаблонов даты и времени, в то время как более новая версия не выполнялась напрямую.

Источник: https://spark.apache.org/docs/latest/sql-migration-guide.html

person phoenix007    schedule 01.05.2021
comment
Хорошее расследование :) Я оставляю ссылку на код здесь только для справки 2.4.6: github.com/apache/spark/blob/v2.4.6/sql/catalyst/src/main/scala / 3.1.1: github.com/apache/spark/blob/v3.1.1/sql/catalyst/src/main/scala/ - person pltc; 14.05.2021