在Spark中使用毫秒格式更正时间戳

时间:2019-08-14 13:51:17

标签: scala apache-spark timestamp

在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|
+--------------------------+----+

2 个答案:

答案 0 :(得分:1)

曾经有过这个问题。通过降低ms的精度来解决。不太理想,但是可行。

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

答案 1 :(得分:0)

从您能找到的herehere来看,正确的是:yyyy-MM-dd HH:mm:ss.SSSSSS