Конвертировать строковую эпоху в строку времени в Scala - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть столбец ORDER_DATE с отметкой времени эпохи в строке.Как я могу преобразовать этот столбец со строкой, такой как str = "1536309236032", которая является временем в эпоху, в строку с форматом: 2018-09-07T14:03:56.032Z в Scala?

В настоящее время я использую:

from_unixtime(input.col(ORDER_DATE), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

, ноэто неправильно преобразуется в 50668-08-21 01:10:00.000.Здесь он увеличивает год и увеличивает значение 000 на миллисекунды.

Я не хочу делить на 1000, поскольку мы хотим получить результат в миллисекундах.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Мне пришла идея от @Shaido, и я сделал нечто подобное.Наконец, это решило проблему для меня:

input.withColumn("time",
concat(from_unixtime(input.col("ORDER_DATE")/1000, "yyyy-MM-dd'T'HH:mm:ss"), 
typedLit("."), substring(input.col("ORDER_DATE"), 11, 3), typedLit("Z")))
0 голосов
/ 19 сентября 2018

В документации определение 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 цифры в метке времени эпохи такие же, как и в требуемом результате.

...