2015-06-30 3 views
15

Ich habe einen Datenrahmen mit einer Spalte von Unix-Timestamp (zB.11435655706000), und ich möchte es in Daten mit dem Format 'JJJJ-MM-DD' konvertieren, ich habe versuchte nscala-time aber es funktioniert nicht.Wie konvertiert man den Unix-Zeitstempel in Spark

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

und ich habe Fehler: java.lang.IllegalArgumentException: Ungültige Format: "1435655706000" auf "6000" malformed

+0

http://stackoverflow.com/questions/18680398/convert-seconds-since-epoch-to-joda-datetime-in-scala – ipoteka

+0

Gelöst, importieren org.joda.time._, sqlc.sql ("select ts from mr"). Map (Zeile => new DateTime (line (0)). ToString ("yyyy-MM-dd")) – youngchampion

Antwort

3

Ich habe dieses Problem gelöst mit der joda-time Bibliothek durch die Abbildung auf dem DataFrame und Umwandeln des DateTime in einen String:

import org.joda.time._ 
val time_col = sqlContext.sql("select ts from mr") 
         .map(line => new DateTime(line(0)).toString("yyyy-MM-dd")) 
8
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, um Ihren Fall Einstellung:

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

Es gibt eine andere Art und Weise sein könnte:

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

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

this helps :)

4

Sie konvertieren müssen nicht vor dem String Anwenden auf toDataTime mit nscala_time

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

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

`

17

Seit spark1.5 gibt es eine eingebaute UDF, dass zu tun.

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.

+0

Sie können org.apache.spark.sql.functions._ auch importieren, um diese Funktionen in Funktionsaufrufen zu verwenden. Beispiel: df.select (from_unitime ($ "ts_col"/1000, "jjjj-MM-dd")). ToDF ("event_date"). GroupBy ("ereignis_datum"). Count – panther

+3

Das Problem ist, dass die aktuelle Zeitzone verwendet wird für die Konvertierung, nicht UTC – Oleg

5

Hier wird mit Scala Datenrahmen Funktionen: from_unix_time und 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)))