У нас есть 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
это выглядит правильно. Есть ли лучший способ реализовать это ??