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

问题描述 投票:31回答:7

我有一个带有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)

我收到错误消息:java.lang.IllegalArgumentException:无效格式:“ 1435655706000”的格式为“ 6000”]

scala datetime apache-spark timestamp nscala-time
7个回答
25
投票

自spark1.5起,就有一个内置的UDF用于执行此操作。

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

请检查Spark 1.5.2 API Doc了解更多信息。


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))) 

14
投票
import org.joda.time.{DateTimeZone}
import org.joda.time.format.DateTimeFormat

您需要导入以下库。

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

或根据您的情况调整:

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

可能有另一种方式:

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

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

希望这会有所帮助:)


6
投票

我已经通过使用joda-time库解决了这个问题,方法是映射到DataFrame并将DateTime转换为字符串:

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

6
投票

在使用nscala_time应用于DataTime之前,您无需转换为String

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

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

`


1
投票

您可以做的是:

input.withColumn("time", concat(from_unixtime(input.col("COL_WITH_UNIX_TIME")/1000,
"yyyy-MM-dd'T'HH:mm:ss"), typedLit("."), substring(input.col("COL_WITH_UNIX_TIME"), 11, 3), 
typedLit("Z")))

其中time是新的列名称,而COL_WITH_UNIX_TIME是要转换的列的名称。这将以毫秒为单位提供数据,使您的数据更准确,例如:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"


1
投票

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

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

0
投票

没有足够的仓库来评论,但是

我以这种方式解决了UTC问题:to_utc_timestamp(from_unixtime($“ buyOrdrEntryTime” / 1000,“ yyyy-MM-ddhh:mm:ss“),”欧洲/柏林“).as(” buyOrdrEntryTime“)。以这种方式指定时区以避免日光节约问题。希望这可以帮助。 –和BI一起玩

如果不是在柏林的时区中生成时间戳,则不是UTC。

© www.soinside.com 2019 - 2024. All rights reserved.