Hive 在配置单元中以毫秒为单位的历元到以毫秒为单位的时间戳转换

Hive 在配置单元中以毫秒为单位的历元到以毫秒为单位的时间戳转换,hive,timestamp,hiveql,unix-timestamp,Hive,Timestamp,Hiveql,Unix Timestamp,如何在配置单元中将unix历元(毫秒)转换为时间戳(毫秒)? cast()和from_unixtime()函数都无法获取毫秒时间戳 我尝试了.SSS,但该函数只是增加年份,而不是将其作为毫秒的一部分 scala> spark.sql("select from_unixtime(1598632101000, 'yyyy-MM-dd hh:mm:ss.SSS')").show(false) +-----------------------------------------

如何在配置单元中将unix历元(毫秒)转换为时间戳(毫秒)? cast()和from_unixtime()函数都无法获取毫秒时间戳

我尝试了
.SSS
,但该函数只是增加年份,而不是将其作为毫秒的一部分

scala> spark.sql("select from_unixtime(1598632101000, 'yyyy-MM-dd hh:mm:ss.SSS')").show(false)
+-----------------------------------------------------+
|from_unixtime(1598632101000, yyyy-MM-dd hh:mm:ss.SSS)|
+-----------------------------------------------------+
|52628-08-20 02:00:00.000                             |
+-----------------------------------------------------+


我想你可以
cast()


请注意,这将生成一个
时间戳
数据类型,而不是字符串,如
from_unixtime()
from_unixtime
以秒为单位工作,而不是毫秒。从_unixtime(ts div 1000)转换为以秒为单位的时间戳,与“.”+毫秒(mod(ts,1000))连接并强制转换为时间戳。在蜂箱中测试:

with your_data as (
select stack(2,1598632101123, 1598632101000) as ts
)

select cast(concat(from_unixtime(ts div 1000),'.',mod(ts,1000)) as timestamp)
from your_data;
结果:

2020-08-28 16:28:21.123
2020-08-28 16:28:21.0

谢谢@GMB!我以前也尝试过这个方法,但它减少了毫秒数(在这个特殊的情况下,epoch最后有
000
),这让我思考它是否在所有情况下都有效。
2020-08-28 16:28:21.123
2020-08-28 16:28:21.0