Spark scala преобразовать строку в метку времени (1147880044 -> формат «мм / дд / гггг ЧЧ: мм: сс») - PullRequest
0 голосов
/ 21 июня 2020

У меня есть данные ниже, я хочу добавить столбец ratingtimestamp с отформатированной меткой времени. Но я получаю в нем null.

+------+-------+------+----------+---------------+
|userId|movieId|rating| ts       |ratingtimestamp|
+------+-------+------+----------+---------------+
|     1|    296|   5.0|1147880044|           null|
|     1|    306|   3.5|1147868817|           null|

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

val data2 = data.withColumn ("ratingtimestamp", col ("ts"). Cast ( TimestampType))

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Я думаю, столбец ts имеет тип integer. попробуйте преобразовать его в long, а затем timestamp, как показано ниже -

df.withColumn("ts_new", $"ts".cast("long").cast("timestamp"))

, поскольку формат по умолчанию - yyyy-MM-dd HH:mm:ss, вы увидите результат show() в формате yyyy-MM-dd HH:mm:ss.

Вы можете преобразовать формат по умолчанию в новый формат, например MM/dd/yyyy HH:mm:ss, используя -

from_unixtime($"ts_new".cast("long"),"MM/dd/yyyy HH:mm:ss")
0 голосов
/ 21 июня 2020

Используйте функции from_unixtime и date_format.

scala> val df = Seq(("1","296","5.0","1147880044","null"),("1","306","3.5","1147868817","null")).toDF("userId","movieId","rating","ts","ratingtimestamp")
df: org.apache.spark.sql.DataFrame = [userId: string, movieId: string ... 3 more fields]

scala> df.show(false)
+------+-------+------+----------+---------------+
|userId|movieId|rating|ts        |ratingtimestamp|
+------+-------+------+----------+---------------+
|1     |296    |5.0   |1147880044|null           |
|1     |306    |3.5   |1147868817|null           |
+------+-------+------+----------+---------------+
scala> df.withColumn("ratingtimestamp",date_format(from_unixtime($"ts"),"MM/dd/yyyy HH:mm:ss")).show(false)
+------+-------+------+----------+-------------------+
|userId|movieId|rating|ts        |ratingtimestamp    |
+------+-------+------+----------+-------------------+
|1     |296    |5.0   |1147880044|05/17/2006 21:04:04|
|1     |306    |3.5   |1147868817|05/17/2006 17:56:57|
+------+-------+------+----------+-------------------+
scala> df.withColumn("ratingtimestamp",from_unixtime($"ts","MM/dd/yyyy HH:mm:ss")).show(false)
+------+-------+------+----------+-------------------+
|userId|movieId|rating|ts        |ratingtimestamp    |
+------+-------+------+----------+-------------------+
|1     |296    |5.0   |1147880044|05/17/2006 21:04:04|
|1     |306    |3.5   |1147868817|05/17/2006 17:56:57|
+------+-------+------+----------+-------------------+
...