Как сохранить миллисекунды при преобразовании строки даты и времени в метку времени с помощью PySpark? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь преобразовать столбец, содержащий дату и время в виде строк, в метку времени, однако я теряю часть миллисекунд во время преобразования.

Данные

У меня есть кадр данных Spark df у которого есть дата и столбец времени, содержащий строки.Строка времени содержит миллисекунды, как показано ниже:

+---------+------------+
|date     |time        |
+---------+------------+
|2018/1/2 |09:53:25.864|
|2018/1/3 |11:32:21.689|
|2018/1/4 |09:34:51.045|
+---------+------------+

То, что я пытался

Я конкатенировал date и time столбцы, чтобы получить date_and_time столбец (строку):

import spark.sql.functions as F

df = df.withColumn('date_and_time', F.concat_ws(' ', df.date, df.time))

df.show(3, False)

Вывод:

+--------+------------+---------------------+
|date    |time        |date_and_time        |
+--------+------------+---------------------+
|2018/1/2|09:53:25.864|2018/1/2 09:53:25.864|
|2018/1/3|11:32:21.689|2018/1/3 11:32:21.689|
|2018/1/4|09:34:51.045|2018/1/4 09:34:51.045|
+--------+------------+---------------------+

Затем я указал формат отметки времени, используя Простой формат даты и шаблоны даты и времени :

timestamp_format = 'yyyy/M/d HH:mm:ss.SSS'

ЗатемЯ попытался преобразовать эту строку в метку времени, используя несколько разных способов:

df.select(
    df.date_and_time,
    F.to_timestamp(df.date_and_time, timestamp_format).alias('method_1'),
    F.unix_timestamp(df.date_and_time, format=timestamp_format).cast('timestamp').alias('method_2')
).show(3, False)

Как вы можете видеть ниже, метка времени пропускает часть миллисекунд:

+---------------------+-------------------+-------------------+
|date_and_time        |method_1           |method_2           |
+---------------------+-------------------+-------------------+
|2018/1/2 09:53:25.864|2018-01-02 09:53:25|2018-01-02 09:53:25|
|2018/1/3 11:32:21.689|2018-01-03 11:32:21|2018-01-03 11:32:21|
|2018/1/4 09:34:51.045|2018-01-04 09:34:51|2018-01-04 09:34:51|
+---------------------+-------------------+-------------------+

Как я могу сохранить миллисекунды при преобразовании строки в метку времени?

Я использую PySpark (Spark: 2.3.1, Python: 3.6.5).

Я посмотрелна ранее отвеченные вопросы по SO и не нашли подходящего решения.

...