В документации определение from_unixtime
выглядит следующим образом:
Преобразует количество секунд из эпохи Unix (1970-01-01 00:00:00 UTC) в строку, представляющую метку времени этого момента в текущем системном часовом поясе в заданном формате.
Используются секунды и, следовательно, они не совместимы с миллисекундами, поэтому результат неверен.Чтобы преобразовать метку времени эпохи и сохранить информацию в миллисекундах, вы можете использовать concat
:
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
df.withColumn("time", concat(
from_unixtime($"ORDER_DATE"/1000, "yyyy-MM-dd'T'HH:mm:ss."),
$"ORDER_DATE".substr(length($"ORDER_DATE")-2, length($"ORDER_DATE")),
lit("Z")))
Это будет работать, поскольку последние 3 цифры в метке времени эпохи такие же, как и в требуемом результате.