2017-10-09 127 views
0

我使用星火2.1.0在UNIX中,发现在那里UNIX_TIMESTAMP正在发生变化小时,一个特定的时间戳一个奇怪的问题变化小时,我创建了一个数据帧如下UNIX_TIMESTAMP()函数中阶火花

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

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

回答

4

2017年3月12日2:02 AM在很多时区都不是有效的时间。那是当夏令时开始,时钟在美国从1:59:59跳到3:00:00。

我的猜测是你的本地机器和火花簇具有不同的系统时区设置。

+0

这很有道理,我的本地系统在格林威治标准时间+5.30和服务器在EDT。 – Himanshu

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