Ответ от Tanjin не работает, когда значения имеют тип timestamp
, а миллисекунды представляют собой круглые числа (например, 390, 500).Python обрезает 0
в конце, и временная метка из примера будет выглядеть так: 2018-07-25 17:15:06.39
.
Проблема заключается в жестко заданном значении в F.substring('max_ts', -3, 3)
.Если 0
в конце отсутствует, то substring
становится диким.
Чтобы преобразовать tmpColumn
столбца типа timestamp
в tmpLongColumn
типа long
Я использовал этот фрагмент:
timeFmt = "yyyy-MM-dd HH:mm:ss.SSS"
df = df \
.withColumn('tmpLongColumn', F.substring_index('tmpColumn', '.', -1).cast('float')) \
.withColumn('tmpLongColumn', F.when(F.col('tmpLongColumn') < 100, F.col('tmpLongColumn')*10).otherwise(F.col('tmpLongColumn')).cast('long')) \
.withColumn('tmpLongColumn', (F.unix_timestamp('tmpColumn', format=timeFmt)*1000 + F.col('tmpLongColumn'))) \
Первое преобразование извлекает подстроку, содержащую миллисекунды.Затем, если значение меньше 100, умножьте его на 10. Наконец, преобразуйте метку времени и добавьте миллисекунды.