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