scala datetime apache-spark timestamp nscala-time

scala - Cómo convertir la marca de tiempo de Unix hasta la fecha en Spark



datetime apache-spark (6)

Aquí está utilizando las funciones Scala DataFrame: from_unixtime y 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)))

Tengo un marco de datos con una columna de marca de tiempo de Unix (por ejemplo, 1435655706000), y quiero convertirlo a datos con el formato ''aaaa-MM-DD'', lo he intentado con nscala-time pero no funciona.

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

y obtuve el error: java.lang.IllegalArgumentException: Formato no válido: "1435655706000" tiene un formato incorrecto en "6000"


Desde spark1.5, hay un UDF incorporado para hacer eso.

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

Por favor, compruebe Spark 1.5.2 API Doc para más información.


Lo que puedes hacer es:

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")))

donde tiempo es un nuevo nombre de columna y COL_WITH_UNIX_TIME es el nombre de la columna que desea convertir. Esto le dará datos en milis, haciendo que sus datos sean más precisos, como: "yyyy-MM-dd''T''HH:mm:ss.SSS''Z''"


No necesita convertir a String antes de aplicar toDataTime con nscala_time

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

scala> 1435655706000L.toDateTime res4: org.joda.time.DateTime = 2015-06-30T09:15:06.000Z

`


DataFrame este problema usando la biblioteca joda-time asignando el DataFrame y convirtiendo el DateTime en una cadena:

import org.joda.time._ val time_col = sqlContext.sql("select ts from mr") .map(line => new DateTime(line(0)).toString("yyyy-MM-dd"))


import org.joda.time.{DateTimeZone} import org.joda.time.format.DateTimeFormat

Es necesario importar las siguientes bibliotecas.

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

O ajustándose a su caso:

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

Podría haber otra manera:

import com.github.nscala_time.time.Imports._ val date = (new DateTime() + ((threshold.toDouble)/1000).toInt.seconds ) .toString("yyyy/MM/dd")

Espero que esto ayude :)