wake-up-neo.com

So konvertieren Sie Unix-Zeitstempel in Spark in Datum

Ich habe einen Datenrahmen mit einer Spalte mit einem Unix-Zeitstempel (z. B. 1435655706000) und möchte ihn in Daten mit dem Format 'yyyy-MM-DD' konvertieren. Ich habe es mit nscala-time versucht, aber es funktioniert nicht.

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

und ich habe eine Fehlermeldung erhalten: Java.lang.IllegalArgumentException: Ungültiges Format: "1435655706000" ist bei "6000" fehlerhaft.

23
youngchampion

Seit spark1.5 gibt es dafür eine eingebaute UDF.

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

Bitte überprüfen Sie Spark 1.5.2 API Doc für weitere Informationen.

21
Yuan Zhao

Hier werden die Scala DataFrame-Funktionen verwendet: from_unixtime und bis_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))) 
15
Gevorg
import org.joda.time.{DateTimeZone}
import org.joda.time.format.DateTimeFormat

Sie müssen die folgenden Bibliotheken importieren.

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

Oder passen Sie sich Ihrem Fall an: 

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

Es könnte einen anderen Weg geben: 

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

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

Hoffe das hilft :)

12
Hammad Haleem

Sie müssen nicht in String konvertieren, bevor Sie mit nscala_time auf DataTime anwenden

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

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

`

6
Orar

Ich habe dieses Problem mit der Bibliothek joda-time gelöst, indem ich die DataFrame zugeordnet und die DateTime in einen String konvertiert:

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

Sie können die folgende Syntax in Java verwenden

input.select("timestamp)
            .withColumn("date", date_format(col("timestamp").$div(1000).cast(DataTypes.TimestampType), "yyyyMMdd").cast(DataTypes.IntegerType))
0
Alex Stanovsky

Was Sie tun können, ist:

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

dabei ist Uhrzeit ein neuer Spaltenname und COL_WITH_UNIX_TIME der Name der Spalte, die Sie konvertieren möchten. Dadurch erhalten Sie Daten in Millis, sodass Ihre Daten genauer sind, beispielsweise: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"