Преобразование даты / времени Проблема при чтении ZonedDateTime в Pyspark с использованием read.csv - PullRequest
0 голосов
/ 14 января 2020

У нас есть CSV-файл, содержащий значение DateTime, которое может иметь несколько форматов, как показано ниже

usertimestamp
2019-10-09T22:48:34.000-04:00  -> Zoned Time
2019-10-09T22:48:34            -> Date/Time with no zone information 
2019-10-09T02:56:44.000Z       -> UTC 

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

    schema = StructType([\
                        StructField("usertimestamp", TimeStampType(), True), 
                        ]
    df_results = spark.read.csv(files, \
            sep=",", \
            timestampFormat="MM/dd/yyyy HH:mm:ss",
            header="true",
            schema=schema
            )

Когда мы запускаем этот скрипт, фрейм данных показывает, что зонированная дата / время показываются некорректно через эту проблему. Есть ли способ настроить чтение так, чтобы оно непосредственно понимало ZonedDateTime ... Я попытался обойти, что

  • Читает данные в виде строки
  • Использовал substring_index в искре sql для удаления временного смещения
  • Использовал date_format в искре sql, чтобы преобразовать его обратно в дату

Пример кода написан ниже

schema = StructType([StructField("usertimestamp", StringType(), True)]
df_results= spark.read.csv(files, \
            sep=",", \
            timestampFormat="MM/dd/yyyy HH:mm:ss",
            header="true",
            schema=schema
            )
df_results.createOrReplaceTempView("results") 
spark_formatted_results =  spark.sql("select date_format(substring_index(usertimestamp,'.',1),'MM/dd/yyyy HH:mm:ss')  as usertimestamp_modified from  results")

Это дало мне следующие результаты

usertimestamp      
10/09/2019 22:48:34
10/09/2019 22:48:34
10/09/2019 02:56:44

это выглядит правильно. Есть ли лучший способ реализовать это ??

...