datetime—将sparkDataframe中的日期时间戳转换为epoctimestamp

wd2eg0qa  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(531)

我有这个格式的带有时间戳列的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时间戳,这是不需要的。

8fsztsew

8fsztsew1#

使用sparkDataframe函数,

df.withColumn("timestamp", to_timestamp($"time", "yyyy-MM-dd HH:mm:ss.SSSSSSXXX"))
  .withColumn("epoch", ($"timestamp".cast("decimal(20, 10)") * 1000).cast("bigint"))
  .show(false)

+--------------------------------+---------------------+-------------+
|time                            |timestamp            |epoch        |
+--------------------------------+---------------------+-------------+
|2020-07-07 18:30:14.500000+00:00|2020-07-07 18:30:14.5|1594146614500|
+--------------------------------+---------------------+-------------+

这也是一种可行的方法。

nwlqm0z1

nwlqm0z12#

我建议您从 java.util 以及相应的格式化api( java.text.SimpleDateFormat )到现代日期/时间api java.time 以及相应的格式化api( java.time.format ). 从trail:date-time了解有关现代日期时间api的更多信息

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2020-07-07 18:30:14.500000+00:00",
                DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSZZZZZ"));
        System.out.println(odt.toInstant().toEpochMilli());
    }
}

输出:

1594146614500

相关问题