将Spark数据帧中的日期时间时间戳转换为epocTimestamp

问题描述

我有一个用熊猫编写的TimeStamp列格式为2020-07-07 18:30:14.500000+00:00的镶木地板文件。当我在Spark中读取相同的实木复合地板文件时,该文件被读取为2020-07-08 00:00:14.5

我想将其转换为纪元时间戳,以毫秒为单位1594146614500

我尝试使用Java日期时间格式

val dtformat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
dtformat.parse(r2.getAs[Long]("date_time").toString).getTime

它正在转换但值错误(1594146614005),而不是1594146614500。

要使其正确,我必须添加dtformat.parse(r2.getAs[Long]("date_time").toString+"00").getTime。 除此以外还有其他清洁方法吗?

spark中有可用的函数以毫秒为单位来读取它吗?

更新1:

使用以下答案后:

df.withColumn(“ timestamp”,to_timestamp($“ date_time”,“ yyyy-MM-dd HH:mm:ss.SSSSSSXXX”))。withColumn(“ epoch”,($“ timestamp” .cast(“十进制(20,10)“)* 1000).cast(” bigint“))。show()

+-------------+--------------------+-------------------+-------------+
|expected_time|       original_time|          timestamp|        epoch|
+-------------+--------------------+-------------------+-------------+
|1597763904500|2020-08-18 20:48:...|2020-08-18 20:48:24|1597763904000|
|1597763905000| 2020-08-18 20:48:25|2020-08-18 20:48:25|1597763905000|
|1597763905500|2020-08-18 20:48:...|2020-08-18 20:48:25|1597763905000|

假定数据的粒度为500毫秒,则回退是假定每个时间戳都有两个相同的epoc时间戳,这是不希望的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)