如何在hive中获得毫秒精度?

pftdvrlh  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(581)

文档说明时间戳支持以下转换:
•浮点数字类型:以秒为单位,以十进制精度解释为unix时间戳
首先,我不知道该怎么解释。如果我有时间戳2013-01-01 12:00:00.423,我可以将其转换为保留毫秒的数字类型吗?因为这就是我想要的。
一般来说,我需要比较时间戳,比如

select maxts - mints as latency from mytable

其中maxts和mint是时间戳列。现在,这给了我 NullPointerException 使用hive 0.11.0。我可以执行查询,如果我做了类似的事情

select unix_timestamp(maxts) - unix_timestamp(mints) as latency from mytable

但这只适用于秒,而不是毫秒精度。
谢谢你的帮助。如果你需要更多的信息,请告诉我。

pwuypxnk

pwuypxnk1#

如果要使用毫秒,请不要使用unix时间戳函数,因为这些函数将日期视为自epoch起的秒数。

hive> describe function extended unix_timestamp;
unix_timestamp([date[, pattern]]) - Returns the UNIX timestamp
Converts the current or specified time to number of seconds since 1970-01-01.

相反,将jdbc兼容的时间戳转换为double。
例如:
给定制表符分隔的数据:

cat /user/hive/ts/data.txt :
a   2013-01-01 12:00:00.423   2013-01-01 12:00:00.433
b   2013-01-01 12:00:00.423   2013-01-01 12:00:00.733

CREATE EXTERNAL TABLE ts (txt string, st Timestamp, et Timestamp) 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/user/hive/ts';

然后您可以查询starttime(st)和endtime(et)之间的差异(以毫秒为单位),如下所示:

select 
  txt, 
  cast(
    round(
      cast((e-s) as double) * 1000
    ) as int
  ) latency 
from (select txt, cast(st as double) s, cast(et as double) e from ts) q;

相关问题