spark scala long在镶木地板数据帧中以毫秒为单位转换为时间戳

问题描述

有人可以指导我如何将毫秒转换为时间戳吗? 我知道该怎么做yyyy-MM-dd HH:mm:ss 但我想毫秒yyyy-MM-dd HH:mm:ss.SSS

我的实木复合地板结构就是这样

|-- header: struct (nullable = true)
 |    |-- time: long (nullable = true)
...

一个时间样本是1600676073054:

斯卡拉

scala> spark.sql("select from_unixtime(word) as ts,word from tmp_1").show(false)
+--------------------+-------------+
|ts                  |word         |
+--------------------+-------------+
|52693-05-28 18:30:54|1600676073054|
+--------------------+-------------+


scala> spark.sql("select from_unixtime(word/1000) as ts,word from tmp_1").show(false)
+-------------------+-------------+
|ts                 |word         |
+-------------------+-------------+
|2020-09-21 16:14:33|1600676073054|
+-------------------+-------------+


scala> spark.sql("select from_unixtime(word) as ts,word from tmp_1").show(false)
+--------------------+-------------+
|ts                  |word         |
+--------------------+-------------+
|52693-05-28 18:30:54|1600676073054|
+--------------------+-------------+

Sql Server

declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000',@milliseconds bigint = 1600676073054,@MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000

SELECT  DATEADD(MILLISECOND,TRY_CAST(@milliseconds % @millisecondsPerDay AS INT),DATEADD(DAY,TRY_CAST(@milliseconds / @millisecondsPerDay AS INT),@StartDate));
--2020-09-21 08:14:33.054

我想知道如何将054转换为毫秒。

谢谢。

解决方法

Spark不支持历元毫秒,因此您需要将其除以1000。

val df = spark.createDataFrame(
    Seq(
        
       (1,"1600676073054")
    )
).toDF("id","long_timestamp")


 df.withColumn(
        "timestamp_mili",(col("long_timestamp")/1000).cast("timestamp") 
    ).show(false)
    
  //+---+--------------+-----------------------+
  //|id |long_timestamp|timestamp_mili         |
  //+---+--------------+-----------------------+
  //|1  |1600676073054 |2020-09-21 08:14:33.054|
  //+---+--------------+-----------------------+

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...