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
但这仅适用于秒,而不是毫秒精度。
任何帮助表示赞赏。如果您需要其他信息,请告诉我。
答案 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;