2015-06-30 15 views
15

Ho un frame di dati con una colonna di timestamp unix (es. 1435655706000), e voglio convertirlo in dati con il formato 'aaaa-MM-DD', ho provato nscala-time ma non funziona.Come convertire un timestamp unix fino ad oggi in Spark

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

e mi sono errore: java.lang.IllegalArgumentException: Formato non valido: "1.435.655,706 milioni" non è corretto in "6000"

+0

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

+0

Risolto, importare org.joda.time._, sqlc.sql ("seleziona ts da mr"). Map (riga => new DateTime (line (0)). ToString ("yyyy-MM-dd")) – youngchampion

risposta

3

ho risolto questo problema utilizzando la libreria joda-time dalla mappatura sul DataFrame e convertendo il DateTime in una stringa:

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 

È necessario importare le seguenti librerie.

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

o regolare al vostro caso:

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

Ci potrebbe essere un altro modo:

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

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

Spero che questo aiuti :)

4

Non c'è bisogno di convertire in stringa prima applicare 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 

`

17

Dal spark1.5, c'è un'UDF incorporato per farlo.

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

Si prega di controllare Spark 1.5.2 API Doc per maggiori informazioni.

+0

È inoltre possibile importare org.apache.spark.sql.functions._ per utilizzare queste funzioni nelle chiamate di funzione. Esempio: df.select (from_unixtime ($ "ts_col"/1000, "yyyy-MM-dd")). ToDF ("event_date"). GroupBy ("event_date"). Count – panther

+3

Il problema è il fuso orario corrente verrà utilizzato per la conversione, non UTC – Oleg

5

Qui si sta usando le funzioni Scala dataframe: from_unix_time e 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))) 
Problemi correlati