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"
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.
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)))
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 :)
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"))
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
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'"