我有一列ORDER_DATE
,其中的纪元时间戳记为字符串。
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,因为我们希望以毫秒为单位得出结果。
答案 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")))