在 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|
+-----------------------+
如何在 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|
+-----------------------+