Дата в миллисекундах «ГГГГ-ММ-ДД чч:мм:сс.ССС» для данных Pyspark из Hive

У меня есть поле даты, хранящееся в виде строки в таблицах HIVE в следующем формате:

YYYY-MM-DD hh:mm:ss.SSS

Например:

2020-01-20 07:41:21.86754

Но мы наблюдаем следующее поведение:

  • Когда мы выбираем столбец в PySpark как to_timestamp(), мы получаем NULL.
  • Когда мы выбираем ее как обычную строку, она отображается как 2020-01-20 07:41:....; он не показывает полную стоимость.
  • Когда мы пытаемся усечь миллисекунды, они правильно отображаются до секунд как 2020-01-20 07:41:21, но мы хотим, чтобы миллисекунды были включены в DateFrame PySpark для выполнения преобразований.

Как правильно запросить дату, хранящуюся в виде строки?


person Naresh    schedule 12.06.2020    source источник
comment
Всем привет! Я внес ряд правок в ваш пост, чтобы сделать его более читабельным. Пожалуйста, не забудьте просмотреть их оба, чтобы убедиться, что все соответствует вашему предполагаемому смыслу, а также узнать, как форматировать свои сообщения в будущем. Примечательно, что я отформатировал форматы даты как блоки кода, используя обратные кавычки (`), и я отформатировал маркеры как список, поместив каждый в свою строку. Пока я занимался этим, я также внес некоторые изменения в формулировку, чтобы прояснить вопрос, и повторил вопрос в конце. Пожалуйста, просмотрите, и дайте мне знать, если все имеет смысл.   -  person Jeremy Caney    schedule 13.06.2020
comment
@Naresh - вы пробовали ответ ниже? это сработало?   -  person Raghu    schedule 28.06.2020


Ответы (1)


Прежде чем я начну, вопрос о формате времени. Почему значение миллисекунды - 86754? это будет означать 86 секунд и 754 миллисекунды? вы имеете в виду микросекунды? тогда это имеет смысл.

Во всяком случае, я попытался с тем же форматом даты, чтобы проверить, может ли искра справиться с этим, и он это делает.

Рассмотрим тестовый фрейм данных

import pyspark.sql.functions as F
test_df= sqlContext.createDataFrame(["2020-01-20 07:41:21.86754","2020-01-20 07:41:21.86999"],"string").toDF('date')
test_df.show(truncate=False)
+-------------------------+
|date                     |
+-------------------------+
|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|
+-------------------------+
test_res = test_df.withColumn("timestamp",F.to_timestamp(F.col('date')))
test_res.show(truncate=False)
+-------------------------+-------------------------+
|date                     |timestamp                |
+-------------------------+-------------------------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|
+-------------------------+-------------------------+

Как видите, при преобразовании вашей строки в отметку времени нет ошибки. Я использовал это со искрой 2.4.0. Проверьте dtypes результата

test_res.dtypes
[('date', 'string'), ('timestamp', 'timestamp')]

Я все еще заинтригован твоим намерением. Когда вам нужно обработать метку времени, скажем, преобразовав ее в unix_timestamp, вы получите одно и то же значение для двух строк, даже если миллисекунды (или микросекунды в вашем случае) разные

test_res1=test_res.withColumn("unix_time",F.unix_timestamp('date'))
test_res1.show(truncate=False)
+-------------------------+-------------------------+----------+
|date                     |timestamp                |unix_time |
+-------------------------+-------------------------+----------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|1579502481|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|1579502481|
+-------------------------+-------------------------+----------+

То же самое происходит, когда вы пытаетесь преобразовать метку времени в int.

test_longint = test_res1.withColumn("test_int",F.col('timestamp').cast('int'))
test_longint.show()
+--------------------+--------------------+----------+----------+
|                date|           timestamp| unix_time|  test_int|
+--------------------+--------------------+----------+----------+
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
+--------------------+--------------------+----------+----------+

Надеюсь это поможет. Я могу объяснить больше, если я знаю больше о том, что вам нужно.

person Raghu    schedule 22.06.2020