Comment convertir Unix timestamp en date en Spark

j'ai une base de données avec une colonne de timestamp unix(par ex.1435655706000), et je veux le convertir en données avec le format 'AAAA-MM-JJ', j'ai essayé nscala-time mais cela ne fonctionne pas.

val time_col = sqlc.sql("select ts from mr").map(_(0).toString.toDateTime)
time_col.collect().foreach(println)

et je suis d'erreur: Java.lang.IllegalArgumentException: format non Valide: "1435655706000" est mal formé à "6000"

22
demandé sur Hammad Haleem 2015-06-30 12:51:01

6 réponses

Depuis spark1.5 , il y a un builtin UDF de le faire.

val df = sqlContext.sql("select from_unixtime(ts,'YYYY-MM-dd') as `ts` from mr")

Veuillez vérifier Spark 1.5.2 API Doc pour plus d'info.

21
répondu Yuan Zhao 2016-06-01 23:43:00

ici, il utilise les fonctions Scala DataFrame: from_unix_time et to_date

// NOTE: divide by 1000 required if milliseconds
// e.g. 1446846655609 -> 2015-11-06 21:50:55 -> 2015-11-06 
mr.select(to_date(from_unixtime($"ts" / 1000))) 
14
répondu Gevorg 2017-08-10 17:34:48
import org.joda.time.{DateTimeZone}
import org.joda.time.format.DateTimeFormat

Vous devez importer les bibliothèques suivantes.

val stri = new DateTime(timeInMillisec).toDateTime.toString("yyyy/MM/dd")

Ou en s'adaptant à votre cas :

 val time_col = sqlContext.sql("select ts from mr")
                     .map(line => new DateTime(line(0).toInt).toDateTime.toString("yyyy/MM/dd"))

Il pourrait y avoir une autre façon :

  import com.github.nscala_time.time.Imports._

  val date = (new DateTime() + ((threshold.toDouble)/1000).toInt.seconds )
             .toString("yyyy/MM/dd")

Espérons que cela aide :)

11
répondu Hammad Haleem 2016-07-04 06:00:23

j'ai résolu ce problème en utilisant la joda-time bibliothèque en cartographiant sur le DataFrame et la conversion du DateTime dans une Chaîne de caractères :

import org.joda.time._
val time_col = sqlContext.sql("select ts from mr")
                         .map(line => new DateTime(line(0)).toString("yyyy-MM-dd"))
6
répondu youngchampion 2015-11-09 13:18:59

vous n'avez pas besoin de convertir en chaîne avant d'appliquer toDataTime avec nscala_time

import com.github.nscala_time.time.Imports._

scala> 1435655706000L.toDateTime
res4: org.joda.time.DateTime = 2015-06-30T09:15:06.000Z
5
répondu Orar 2016-05-18 23:27:25

Ce que vous pouvez faire est:

input.withColumn("time", concat(from_unixtime(input.col("COL_WITH_UNIX_TIME")/1000,
"yyyy-MM-dd'T'HH:mm:ss"), typedLit("."), substring(input.col("COL_WITH_UNIX_TIME"), 11, 3), 
typedLit("Z")))

où time est un nouveau nom de colonne et COL_WITH_UNIX_TIME est le nom de la colonne que vous voulez convertir. Cela donnera des données en millis, rendant vos données plus précises, comme:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

0
répondu Abhinav Kaushal Keshari 2018-09-19 09:30:50