Обычно гранулярность отметки времени указывается в секундах, поэтому я не думаю, что существует прямой метод сохранения гранулярности в миллисекундах.
В pyspark есть функция unix_timestamp
, которая:
unix_timestamp(timestamp=None, format='yyyy-MM-dd HH:mm:ss')
Преобразование строки времени с заданным шаблоном ('yyyy-MM-dd HH:mm:ss'
, по умолчанию)
в метку времени Unix ( в секундах ), используя часовой пояс по умолчанию и по умолчанию
locale, вернуть ноль, если не получится.
if `timestamp` is None, then it returns current timestamp.
>>> spark.conf.set("spark.sql.session.timeZone", "America/Los_Angeles")
>>> time_df = spark.createDataFrame([('2015-04-08',)], ['dt'])
>>> time_df.select(unix_timestamp('dt', 'yyyy-MM-dd').alias('unix_time')).collect()
[Row(unix_time=1428476400)]
>>> spark.conf.unset("spark.sql.session.timeZone")
Пример использования:
import pyspark.sql.functions as F
res = df.withColumn(colName, F.unix_timestamp(F.col(colName), \
format='yyyy-MM-dd HH:mm:ss.000').alias(colName) )
Что вы можете сделать, это разделить строку даты (str.rsplit('.', 1)
), разделяя миллисекунды (например, путем создания другого столбца) в вашем фрейме данных.
EDIT
В вашем примере проблема в том, что время имеет тип string. Сначала вам нужно преобразовать его в тип timestamp
: это можно сделать с помощью:
res = time_df.withColumn("new_col", to_timestamp("dt", "yyyyMMdd-hh:mm:ss"))
Тогда вы можете использовать unix_timestap
res2 = res.withColumn("time", F.unix_timestamp(F.col("parsed"), format='yyyyMMdd-hh:mm:ss.000').alias("time"))
Наконец, чтобы создать столбцы с миллисекундами:
res3 = res2.withColumn("ms", F.split(res2['dt'], '[.]').getItem(1))