unix_timestamp()函数在scala spark中更改小时

时间:2017-10-09 18:28:09

标签: scala dataframe spark-dataframe unix-timestamp

我在unix中使用Spark 2.1.0并发现一个奇怪的问题,其中unix_timestamp正在改变一个特定时间戳的小时,我创建了一个数据帧,如下所示

对于df2中的第一条记录,将“20170312020200”作为字符串,我后来将其转换为df3中的时间戳,小时应为02但是在df3中为03。但是第二条记录在将字符串转换为时间戳方面没有问题。

当我在本地系统中使用Intellij运行应用程序时,不会发生这种情况。当我们运行我们的应用程序时,这也会发生在spark-submit中。

2 个答案:

答案 0 :(得分:4)

2017年3月12日凌晨2:02不是很多时区的有效时间。那是夏令时开始的时候,美国时间从1:59:59跳到凌晨3点。

我的猜测是您的本地计算机,而火花群集具有不同的系统时区设置。

答案 1 :(得分:1)

我使用Spark 2,您可以看到以下结果,您的问题与unix_timestamp或Spark版本无关,请检查您的数据。

import org.apache.spark.sql.functions.unix_timestamp

val df2 = sc.parallelize(Seq(
      (10, "date", "20170312020200"), (10, "date", "20170312050200"))
    ).toDF("id ", "somthing ", "datee")

df2.show()

val df3=df2.withColumn("datee", unix_timestamp($"datee", "yyyyMMddHHmmss").cast("timestamp"))


df3.show()  



+---+---------+--------------+
|id |somthing |         datee|
+---+---------+--------------+
| 10|     date|20170312020200|
| 10|     date|20170312050200|
+---+---------+--------------+

+---+---------+-------------------+
|id |somthing |              datee|
+---+---------+-------------------+
| 10|     date|2017-03-12 02:02:00|
| 10|     date|2017-03-12 05:02:00|
+---+---------+-------------------+

import org.apache.spark.sql.functions.unix_timestamp
df2: org.apache.spark.sql.DataFrame = [id : int, somthing : string ... 1 more field]
df3: org.apache.spark.sql.DataFrame = [id : int, somthing : string ... 1 more field]