我的一个Hive表中有一个列为String
格式的列。将该表加载到Spark后,我使用unix_timestamp()
函数将这些日期转换为unix时间戳格式。当我在不同的Spark环境中使用它时,我得到相同日期和相同日期格式的不同值。
以下是行2017-08-04 03:26:51.756658
之一的样本日期,传递给unix_timestamp()
函数的日期格式为yyyy-MM-dd HH:mm:ss.SSSSSS
使用的实际命令如下:
val baseWithUnixTime = base.withColumn("ZZOTIMSTP",
$"ZZOTIMSTP".cast(TimestampType))
.withColumn("ZZOTIMSTP", $"ZZOTIMSTP".cast(TimestampType))
.withColumn("unix_time", unix_timestamp($"ZZOTIMSTP", "yyyy-MM-dd HH:mm:ss.SSSSSS"))
当我在本地Spark中执行上述命令时,对于此2017-08-04 03:26:51.756658
值,我得到1501813611
作为unix时间戳。
当我在EMR Spark集群中执行相同的命令时,我得到1501817211
值。
如果我使用select unix_timestamp("2017-08-04 03:26:51.756658", "yyyy-MM-dd HH:mm:ss.SSSSSS");
命令在Hive中尝试相同的操作,我会得到1501817967
这个值。
总结一下,环境明智的结果如下:
+---------------------------+-----------+
| local Spark (version 2.2) | 1501813611|
+---------------------------|-----------+
| Spark in EMR (version 2.1)| 1501817211|
+---------------------------|-----------+
| Hive | 1501817967|
+---------------------------|-----------+
我想知道哪个给了我真正的价值?为什么Hive和Spark为相同的函数和相同的值集赋予不同的值?