我有这个格式的带有时间戳列的Parquet文件 2020-07-07 18:30:14.500000+00:00
写于Pandas。当我在spark中读取相同的Parquet文件时,它被读取为 2020-07-08 00:00:14.5
.
我想把它转换成以毫秒为单位的历元时间戳 1594146614500
我尝试过使用java datetime格式
val dtformat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
dtformat.parse(r2.getAs[Long]("date_time").toString).getTime
信息技术;s转换但值错误(1594146614005),而不是1594146614500。
为了使它正确,我必须补充 dtformat.parse(r2.getAs[Long]("date_time").toString+"00").getTime
. 还有什么比这更干净的方法吗?
spark中有任何函数可以将其读取为毫秒吗?
更新1:
使用以下答案后:
df.withcolumn(“timestamp”,to\u timestamp($“date\u time”,“yyyy-mm-dd hh:mm:ss.ssssss ”)).withcolumn(“epoch”,($“timestamp”.cast(“decimal(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|
缺点是假设数据的粒度为500ms,那么每个时间戳都有两个相同的epoc时间戳,这是不需要的。
2条答案
按热度按时间8fsztsew1#
使用sparkDataframe函数,
这也是一种可行的方法。
nwlqm0z12#
我建议您从
java.util
以及相应的格式化api(java.text.SimpleDateFormat
)到现代日期/时间apijava.time
以及相应的格式化api(java.time.format
). 从trail:date-time了解有关现代日期时间api的更多信息输出: