如何在Spark中将unix时间戳转换为日期

you*_*ion 31 datetime timestamp scala apache-spark nscala-time

我有一个带有unix时间戳列的数据框(例如,1435655706000),我想将其转换为格式为'yyyy-MM-DD'的数据,我尝试了nscala-time但它不起作用.

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

我收到错误:java.lang.IllegalArgumentException:格式无效:"1435655706000"格式错误为"6000"

Yua*_*hao 23

从spark1.5开始,就有了内置的UDF.

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

有关详细信息,请查看Spark 1.5.2 API Doc.

  • 问题是当前时区将用于转换,而不是UTC (9认同)
  • 您也可以导入org.apache.spark.sql.functions._在函数调用中使用这些函数。示例:df.select(from_unixtime($“ ts_col” / 1000,“ yyyy-MM-dd”))。toDF(“ event_date”)。groupBy(“ event_date”)。count (2认同)
  • 嗨@Oleg,我用这种方式解决了UTC问题:to_utc_timestamp(from_unixtime($"buyOrdrEntryTime"/ 1000,"yyyy-MM-dd hh:mm:ss"),"Europe/Berlin").as("buyOrdrEntryTime" ).以这种方式指定时区非常重要,以避免日光节省问题.希望这可以帮助. (2认同)

Mar*_*ace 22

这里使用的是Scala DataFrame函数:from_unixtimeto_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))) 
Run Code Online (Sandbox Code Playgroud)


Ham*_*eem 14

import org.joda.time.{DateTimeZone}
import org.joda.time.format.DateTimeFormat
Run Code Online (Sandbox Code Playgroud)

您需要导入以下库.

val stri = new DateTime(timeInMillisec).toDateTime.toString("yyyy/MM/dd")
Run Code Online (Sandbox Code Playgroud)

或者根据你的情况调整:

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

可能还有另一种方式:

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

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

希望这可以帮助 :)


you*_*ion 6

我已经使用joda-time库通过映射DataFrame并将其DateTime转换为String 来解决了这个问题:

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


Ora*_*rar 6

在使用nscala_time应用toDataTime之前,无需转换为String

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

scala> 1435655706000L.toDateTime
res4: org.joda.time.DateTime = 2015-06-30T09:15:06.000Z
Run Code Online (Sandbox Code Playgroud)

`


Ale*_*sky 5

您可以在 Java 中使用以下语法

input.select("timestamp)
            .withColumn("date", date_format(col("timestamp").$div(1000).cast(DataTypes.TimestampType), "yyyyMMdd").cast(DataTypes.IntegerType))
Run Code Online (Sandbox Code Playgroud)