pyspark unix_timestamp иногда возвращает null - PullRequest
1 голос
/ 04 апреля 2020

для определенных строк - unix_timestamp возвращает нуль

raw_data.select(F.unix_timestamp(F.lit("2019-03-10T02:56:36Z"),format=date_format)).show(1)
+--------------------------------------------------------------+
|unix_timestamp(2019-03-10T02:56:36Z, yyyy-MM-dd'T'HH:mm:ss'Z')|
+--------------------------------------------------------------+
|                                                          null|
+--------------------------------------------------------------+
only showing top 1 row

, но почти для той же строки - я получаю ответ:

+---------------------------------------------------------------------------------------------+
|unix_timestamp(to_utc_timestamp(2019-03-10T02:56:36Z, America/New_York), yyyy-MM-dd HH:mm:ss)|
+---------------------------------------------------------------------------------------------+
|                                                                                   1552204596|
+---------------------------------------------------------------------------------------------+
only showing top 1 row

при первом преобразовании проблемати c строка в UT C отметка времени - это работает ....

raw_data.select(F.unix_timestamp(F.to_utc_timestamp(F.lit("2019-03-10T02:56:36Z"), "America/New_York"))).show(1)
+---------------------------------------------------------------------------------------------+
|unix_timestamp(to_utc_timestamp(2019-03-10T02:56:36Z, America/New_York), yyyy-MM-dd HH:mm:ss)|
+---------------------------------------------------------------------------------------------+
|                                                                                   1552204596|
+---------------------------------------------------------------------------------------------+
only showing top 1 row

это проблема при преобразовании строки с unix_timestamp? как я могу избежать преобразования в UT C?

1 Ответ

1 голос
/ 04 апреля 2020

Проблема связана с отметкой времени 2019-03-10T02:56:36Z как Летнее время Время сохранения начинается 10 марта в 2 часа ночи.

  • В летнее время часы будут установлены на 3AM пропуск 2AM полностью, поэтому не записывается 02:56 время, и это причина для получения null.

  • Когда использовать to_utc_timestamp, вы конвертируете метку времени в UT C, т.е. +5:00, и тогда время становится 07:56, что является действительным результатом unix_time без null.

  • В Для устранения проблемы используйте regexp_replace внутри unix_timestamp для замены 2019-03-10T02 на 2019-03-10T03.

Example:

#invalid time
spark.sql("""select unix_timestamp('2019-03-10T02:56:36Z', "yyyy-MM-dd'T'HH:mm:ss'Z'") unix_time""").show()
#+---------+
#|unix_time|
#+---------+
#|     null|
#+---------+

#valid time
spark.sql("""select unix_timestamp('2019-03-10T03:56:36Z', "yyyy-MM-dd'T'HH:mm:ss'Z'") unix_time""").show()
#+----------+
#| unix_time|
#+----------+
#|1552208196|
#+----------+

#to fix the issue use regexp replace to replace 2019-03-10T02 to 2019-03-10T03
spark.sql("""select unix_timestamp(regexp_replace('2019-03-10T02:56:36Z','2019-03-10T02','2019-03-10T03'), "yyyy-MM-
+----------+
| unix_time|
+----------+
|1552208196|
+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...