2015-06-30 12 views
15

Tôi có một khung dữ liệu có cột dấu thời gian unix (ví dụ.1435655706000) và tôi muốn chuyển đổi nó thành dữ liệu có định dạng 'yyyy-MM-DD', tôi đã đã thử nscala-time nhưng nó không hoạt động.Làm thế nào để chuyển đổi dấu thời gian unix cho đến nay trong Spark

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

và tôi đã lỗi: java.lang.IllegalArgumentException: định dạng không hợp lệ: "1435655706000" thì sai khuôn maãu tại "6000"

+0

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

+0

Giải quyết, nhập khẩu org.joda.time._, sqlc.sql ("chọn ts từ mr") bản đồ (line => new DateTime (dòng (0)). ToString ("yyyy-MM-dd")) – youngchampion

Trả lời

3

Tôi đã giải quyết vấn đề này bằng cách sử dụng thư viện joda-time bởi lập bản đồ trên DataFrame và chuyển đổi DateTime thành một 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 

Bạn cần nhập các thư viện sau.

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

Hoặc điều chỉnh cho trường hợp của bạn:

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

Có thể có một cách khác:

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

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

Hope this helps :)

4

Bạn không cần phải chuyển đổi để String trước áp dụng choDataTime với nscala_time

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

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

'

17

Kể từ spark1.5, có một UDF BUILTIN để làm điều đó.

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

Vui lòng kiểm tra Spark 1.5.2 API Doc để biết thêm thông tin.

+0

Bạn cũng có thể nhập org.apache.spark.sql.functions._ để sử dụng các hàm này trong các cuộc gọi hàm. Ví dụ: df.select (from_unixtime ($ "ts_col"/1000, "yyyy-MM-dd")). ToDF ("event_date"). GroupBy ("event_date") đếm – panther

+3

Vấn đề là múi giờ hiện tại sẽ được sử dụng để chuyển đổi, không phải UTC – Oleg

5

Ở đây nó được sử dụng chức năng Scala DataFrame: from_unix_timeto_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))) 
Các vấn đề liên quan