首页 > 解决方案 > Spark:错误的时间戳解析

问题描述

我正在创建以下数据框

syncs.select($"event.timestamp",to_date($"event.timestamp".cast(TimestampType))).show

这包括以下行

    timestamp|to_date(CAST(`event.timestamp` AS TIMESTAMP))|
-------------+---------------------------------------------+
1589509800768|                                  52339-07-25|
1589509802730|                                  52339-07-25|
1589509809092|                                  52339-07-25|
1589509810402|                                  52339-07-25|
1589509812112|                                  52339-07-25|
1589509817489|                                  52339-07-25|
1589509818065|                                  52339-07-25|
1589509818902|                                  52339-07-25|
1589509819020|                                  52339-07-25|
1589509819425|                                  52339-07-25|
1589509819830|                                  52339-07-25|

基于 1589509800768,是 2020 年 5 月 15 日星期五 02:30:00。

我不明白为什么我会得到这些未来的日期。从时间戳到日期的转换是否也需要某种日期格式?

标签: scaladateapache-sparktimestamp

解决方案


Spark 需要以秒而不是毫秒为单位的纪元时间,因此您可以将其除以 1000。

scala> val values = List(1589509800768L)
values: List[Long] = List(1589509800768)

scala> val df = values.toDF()
df: org.apache.spark.sql.DataFrame = [value: bigint]

scala> df.show(false)
+-------------+
|value        |
+-------------+
|1589509800768|
+-------------+


scala> df.select((col("value") / 1000 ).cast(TimestampType).as("current_time")).show(false)
+-----------------------+
|current_time           |
+-----------------------+
|2020-05-14 19:30:00.768|
+-----------------------+

scala> df.select((col("value") / 1000 ).cast(TimestampType).as("current_time")).withColumn("time_utc",
     |   expr("""to_utc_timestamp(current_time, "PST")""")
     | ).show(false)
+-----------------------+-----------------------+
|current_time           |time_utc               |
+-----------------------+-----------------------+
|2020-05-14 19:30:00.768|2020-05-15 02:30:00.768|
+-----------------------+-----------------------+


推荐阅读