如何在蜂巢中获得毫秒精度?

时间:2013-09-11 09:33:53

标签: hadoop timestamp hive hiveql

documentation表示时间戳支持以下转换:

•浮点数字类型:解释为UNIX时间戳,以秒为单位,精确到小数

首先,我不确定如何解释这一点。如果我有时间戳2013-01-01 12:00:00.423,我可以将其转换为保留毫秒数的数字类型吗?因为这就是我想要的。

更一般地说,我需要在时间戳之间进行比较,例如

select maxts - mints as latency from mytable

其中 maxts mints 是时间戳列。目前,这使我使用Hive 0.11.0 NullPointerException。如果我做

之类的话,我可以执行查询
select unix_timestamp(maxts) - unix_timestamp(mints) as latency from mytable

但这仅适用于秒,而不是毫秒精度。

任何帮助表示赞赏。如果您需要其他信息,请告诉我。

1 个答案:

答案 0 :(得分:11)

如果你想使用毫秒,请不要使用unix时间戳功能,因为这些功能会将日期视为自纪元以来的秒数。

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 compliant timestamp转换为双倍 E.g:

给定制表符分隔数据:

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;