首页 > 解决方案 > Spark 中毫秒格式的正确时间戳

问题描述

在 Spark2 中定义包含毫秒的时间戳的正确格式是什么?

val a = "2019-06-12 00:03:37.981005"
to_timestamp(a, "yyyy-MM-dd HH:mm:ss")   // 2019-06-12 00:03:37
to_timestamp(a, "yyyy-MM-dd HH:mm:ss.FF6")   // null
to_timestamp(a, "yyyy-MM-dd HH:mm:ss.FFFFFF")   // null

这就是我想要做的:

df.withColumn("aa", to_timestamp($"a", "yyyy-MM-dd HH:mm:ss.SSSSSS")).show(false)
+--------------------------+----+
|a                         |aa  |
+--------------------------+----+
|2019-06-12 00:03:37.981005|null|
+--------------------------+----+

标签: scalaapache-sparktimestamp

解决方案


曾经有过这样的问题。通过降低毫秒的精度来解决它。不理想但有效。

df.withColumn("tmp", substring($"a",1,23)).withColumn("res", to_timestamp($"tmp", "yyyy-MM-dd HH:mm:ss.SSS")).show()

编辑

OP 指出上一行只是删除了 ms。试试这个:

import org.apache.spark.sql.types.TimestampType

df.withColumn("tmp", substring($"a",1,23))
  .withColumn("res", (
                          unix_timestamp($"tmp", "yyyy-MM-dd HH:mm:ss.SSS") + 
                          substring($"a", -6, 6).cast("float")/1000000
                     ).cast(TimestampType)
             )

推荐阅读