在 Hive 中以毫秒转换为以毫秒为时间戳的纪元

epoch with milliseconds to timestamp with milliseconds conversion in Hive

如何在 Hive 中将以毫秒为单位的 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():

select cast(1598632101000 / 1000.0 as timestamp)

请注意,这会生成 timestamp 数据类型而不是字符串,如 from_unixtime().

from_unixtime 以秒为单位,而不是毫秒。转换为以秒为单位的时间戳 from_unixtime(ts div 1000),与 '.'+ 毫秒 (mod(ts,1000)) 连接并转换为时间戳。在 Hive 中测试:

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

这是在纯 Spark Scala 中使用 UDF 将 Java 函数包装到 return new Timestamp(ms)

的另一种方法
import java.sql.Timestamp
val fromMilli = udf((ms:Long) => new Timestamp(ms))

#Test
val df = Seq((1598632101123L)).toDF("ts")
df.select(fromMilli($"ts")).show(false)

结果

+-----------------------+
|UDF(ts)                |
+-----------------------+
|2020-08-28 16:28:21.123|
+-----------------------+