J'ai un cadre de données avec une colonne d'horodatage Unix (par exemple, 1435655706000) et je souhaite le convertir en données au format 'aaaa-MM-JJ', j'ai déjà 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 j'ai eu l'erreur: Java.lang.IllegalArgumentException: Format non valide: "1435655706000" est malformé à "6000"
Depuis spark1.5, il existe une UDF intégrée pour 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’informations.
Il utilise ici les fonctions Scala DataFrame: from_unixtime 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 un autre moyen:
import com.github.nscala_time.time.Imports._
val date = (new DateTime() + ((threshold.toDouble)/1000).toInt.seconds )
.toString("yyyy/MM/dd")
J'espère que cela t'aides :)
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
`
J'ai résolu ce problème en utilisant la bibliothèque joda-time en mappant sur la variable DataFrame
et en convertissant la variable DateTime
en chaîne:
import org.joda.time._
val time_col = sqlContext.sql("select ts from mr")
.map(line => new DateTime(line(0)).toString("yyyy-MM-dd"))
Vous pouvez utiliser la syntaxe suivante en Java
input.select("timestamp)
.withColumn("date", date_format(col("timestamp").$div(1000).cast(DataTypes.TimestampType), "yyyyMMdd").cast(DataTypes.IntegerType))
Ce que vous pouvez faire c'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ù heure est un nouveau nom de colonne et COL_WITH_UNIX_TIME est le nom de la colonne que vous souhaitez convertir. Cela donnera des données en millisecondes, rendant vos données plus précises, comme: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"