我在unix中使用Spark 2.1.0并发现一个奇怪的问题,其中unix_timestamp正在改变一个特定时间戳的小时,我创建了一个数据帧,如下所示
对于df2中的第一条记录,将“20170312020200”作为字符串,我后来将其转换为df3中的时间戳,小时应为02但是在df3中为03。但是第二条记录在将字符串转换为时间戳方面没有问题。
当我在本地系统中使用Intellij运行应用程序时,不会发生这种情况。当我们运行我们的应用程序时,这也会发生在spark-submit中。
答案 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]