在Scala中将字符串时代转换为字符串时间戳

时间:2018-09-18 12:39:49

标签: scala datetime apache-spark apache-spark-sql epoch

我有一列ORDER_DATE,其中的纪元时间戳记为字符串。

在Scala中,如何将带有str = "1536309236032"的字符串转换为格式为2018-09-07T14:03:56.032Z的字符串?

当前我正在使用:

from_unixtime(input.col(ORDER_DATE), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

,但这会错误地转换为50668-08-21 01:10:00.000。在这里,它增加了年份,并以毫秒为单位递增000。

我不想除以1000,因为我们希望以毫秒为单位得出结果。

2 个答案:

答案 0 :(得分:1)

在文档中,from_unixtime的定义如下:

  

以给定的格式将从Unix纪元(1970-01-01 00:00:00 UTC)的秒数转换为表示该时刻在当前系统时区中的时间戳的字符串。

它使用秒,因此与毫秒不兼容,这就是结果错误的原因。要转换时代时间戳记并保留毫秒信息,可以使用select * from orders WHERE id in ( select orderId from orderdetails where flavorId in ( '616a6d8e-be2e-4740-820b-1cad2a3d89b5', '5d02f25b-f717-4079-97af-8aa444fe26b1', '3504be8b-bebe-4b69-a22f-724d90003f99', 'c0a5a036-6dbe-417d-afcf-644f5520f2a8', '29bfdea5-f270-44f0-9f48-245992af8401', '29e53a21-4fdc-40e7-8bd9-733058a48097', '60a90505-b9f5-4a60-8444-a35c2477d4a5', 'c9b93e89-98b0-4765-aedf-3a5f9d182c77', '651ea709-a885-4f12-ad53-3290e8f0b18f', 'c5962375-d4d5-4ec7-82c0-0293475e6204', '7faeffc0-fa88-4904-a6a9-7201949b23fd', '24979b0d-7200-4a7d-9271-d26912d1b16d', '5efeb81a-7642-4484-b8fc-62544bc8bff7' ) ) and isInvoiced = 1 and isShipped = 0 and isOnHold = 0

concat

这将起作用,因为纪元时间戳中的最后3位数字与所需结果中的最后3位数字相同。

答案 1 :(得分:0)

我从@Shaido那里得到了这个主意,我做了类似的事情。最后,这为我解决了这个问题:

input.withColumn("time",
concat(from_unixtime(input.col("ORDER_DATE")/1000, "yyyy-MM-dd'T'HH:mm:ss"), 
typedLit("."), substring(input.col("ORDER_DATE"), 11, 3), typedLit("Z")))