Pyspark from_unixtime (unix_timestamp) не конвертируется в метку времени - PullRequest
0 голосов
/ 24 января 2019

Я использую Pyspark с Python 2.7. У меня есть столбец даты в строке (с мс) и я хотел бы преобразовать в отметку времени

Это то, что я пробовал до сих пор

df = df.withColumn('end_time', from_unixtime(unix_timestamp(df.end_time, '%Y-%M-%d %H:%m:%S.%f')) )

printSchema() показывает end_time: string (nullable = true)

когда я использовал метку времени как тип переменной

Ответы [ 3 ]

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

Может помочь следующее: -

from pyspark.sql import functions as F
df = df.withColumn("end_time", F.from_unixtime(F.col("end_time"), 'yyyy-MM-dd HH:mm:ss.SS').cast("timestamp"))

[Обновлено]

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

Создание образца кадра данных с отметкой времени в формате строки:

import pyspark.sql.functions as F
df = spark.createDataFrame([('22-Jul-2018 04:21:18.792 UTC', ),('23-Jul-2018 04:21:25.888 UTC',)], ['TIME'])
df.show(2,False)
df.printSchema()

Выход:

+----------------------------+
|TIME                        |
+----------------------------+
|22-Jul-2018 04:21:18.792 UTC|
|23-Jul-2018 04:21:25.888 UTC|
+----------------------------+
root
|-- TIME: string (nullable = true)

Преобразование формата времени строки (включая миллисекунды) в unix_timestamp (double) . Поскольку функция unix_timestamp () исключает миллисекунды, нам нужно добавить ее, используя другой простой хак для включения миллисекунд. Извлечение миллисекунд из строки с использованием метода substring (start_position = -7, length_of_substring = 3) и отдельное добавление миллисекунд к unix_timestamp. (Приведение к подстроке с плавающей точкой для добавления)

df1 = df.withColumn("unix_timestamp",F.unix_timestamp(df.TIME,'dd-MMM-yyyy HH:mm:ss.SSS z') + F.substring(df.TIME,-7,3).cast('float')/1000)

Преобразование unix_timestamp (double) в тип данных timestamp в Spark.

df2 = df1.withColumn("TimestampType",F.to_timestamp(df1["unix_timestamp"]))
df2.show(n=2,truncate=False)

Это даст вам следующий вывод

+----------------------------+----------------+-----------------------+
|TIME                        |unix_timestamp  |TimestampType          |
+----------------------------+----------------+-----------------------+
|22-Jul-2018 04:21:18.792 UTC|1.532233278792E9|2018-07-22 04:21:18.792|
|23-Jul-2018 04:21:25.888 UTC|1.532319685888E9|2018-07-23 04:21:25.888|
+----------------------------+----------------+-----------------------+

Проверка схемы:

df2.printSchema()


root
 |-- TIME: string (nullable = true)
 |-- unix_timestamp: double (nullable = true)
 |-- TimestampType: timestamp (nullable = true)
0 голосов
/ 24 января 2019

Попробуйте использовать from_utc_timestamp:

from pyspark.sql.functions import from_utc_timestamp

df = df.withColumn('end_time', from_utc_timestamp(df.end_time, 'PST')) 

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

Если это не работает, приведите пример с несколькими строками, показывающими df.end_time

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