Функция pyspark to_timestamp не конвертирует определенные временные метки - PullRequest
0 голосов
/ 08 января 2019

Я бы хотел использовать функцию to_timestamp для форматирования меток времени в pyspark. Как я могу сделать это без смещения часового пояса или опущения определенных дат. ?

from pyspark.sql.types import StringType
from pyspark.sql.functions import col, udf, to_timestamp

date_format = "yyyy-MM-dd'T'HH:mm:ss"

vals = [('2018-03-11T02:39:00Z'), ('2018-03-11T01:39:00Z'), ('2018-03-11T03:39:00Z')]
testdf = spark.createDataFrame(vals, StringType())
testdf.withColumn("to_timestamp", to_timestamp("value",date_format)).show(4,False)


testdf.withColumn("to_timestamp", to_timestamp("value", date_format)).show(4,False)
+--------------------+-------------------+                                      
|value               |to_timestamp       |
+--------------------+-------------------+
|2018-03-11T02:39:00Z|null               |
|2018-03-11T01:39:00Z|2018-03-11 01:39:00|
|2018-03-11T03:39:00Z|2018-03-11 03:39:00|
+--------------------+-------------------+

Я ожидал, что 2018-03-11T02:39:00Z будет правильно отформатирован до 2018-03-11 02:39:00

Затем я переключился на функцию по умолчанию to_timestamp.

testdf.withColumn("to_timestamp", to_timestamp("value")).show(4,False)`

+--------------------+-------------------+
|value               |to_timestamp       |
+--------------------+-------------------+
|2018-03-11T02:39:00Z|2018-03-10 20:39:00|
|2018-03-11T01:39:00Z|2018-03-10 19:39:00|
|2018-03-11T03:39:00Z|2018-03-10 21:39:00|
+--------------------+-------------------+

1 Ответ

0 голосов
/ 13 января 2019

Сдвиг во времени при вызове to_timestamp() со значениями по умолчанию объясняется тем, что для экземпляра зажигания установлен местный часовой пояс, а не UTC. Вы можете проверить, запустив spark.conf.get('spark.sql.session.timeZone')

Если вы хотите, чтобы ваша метка времени отображалась в UTC, установите значение conf. spark.conf.set('spark.sql.session.timeZone', 'UTC')

Еще один важный момент в вашем коде, когда вы определяете формат даты как "yyyy-MM-dd'T'HH:mm:ss", вы, по сути, просите spark игнорировать часовой пояс и считать все временные метки в UTC / Zulu. Правильный формат будет date_format = "yyyy-MM-dd'T'HH:mm:ssXXX", но это спорный вопрос, если вы вызываете to_timestamp () со значениями по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...