2015-06-30 14 views
15

Mam ramkę danych z kolumną unix timestamp (np. 1435655706000), i chcę przekonwertować go do danych o formacie "yyyy-MM-DD", mam próbowałem nscala-time, ale to nie działa.Jak przekonwertować datownik unix na bieżąco w Spark

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

i mam błąd: java.lang.IllegalArgumentException: Nieprawidłowy format: "1435655706000" jest niepoprawny w "6000"

+0

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

+0

Rozwiązany, import org.joda.time._, sqlc.sql ("select ts from mr") map (line => new DateTime (line (0)). ToString ("rrrr-MM-dd")) – youngchampion

Odpowiedz

3

Mam rozwiązać ten problem przy użyciu biblioteki joda-time poprzez mapowanie w sprawie DataFrame i przekształcenie DateTime do łańcucha:

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 

Musisz zaimportować następujące biblioteki.

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

Albo dostosowując się do sprawy:

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

Nie mogło być inaczej:

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

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

Nadzieja to pomaga :)

4

Nie trzeba konwertować do String przed zastosowanie doDataTime z nscala_time

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

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

`

17

Od spark1.5, nie ma wbudowanego UDF do tej operacji.

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

Proszę sprawdzić Spark 1.5.2 API Doc, aby uzyskać więcej informacji.

+0

Można również zaimportować plik org.apache.spark.sql.functions._, aby użyć tych funkcji w wywołaniach funkcji. Przykład: df.select (from_unixtime ($ "ts_col"/1000, "rrrr-MM-dd")). ToDF ("event_date") groupBy ("event_date") count – panther

+3

Problem dotyczy bieżącej strefy czasowej do konwersji, a nie do UTC – Oleg

5

Tutaj jest przy użyciu funkcji Scala DataFrame: from_unix_time i 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))) 
Powiązane problemy