寻求HIVE(HUE)中无UDF的毫秒级时间差计算方案
解决Hive中计算毫秒级时间差的问题
这个问题我之前也碰到过!你用unix_timestamp默认处理带毫秒的时间时,它会自动截断毫秒部分,只保留秒级精度,所以才会得到错误的1000毫秒结果。下面给你两个不用UDF的解决方案,适配不同的Hive版本:
方法一:使用to_timestamp(Hive 2.0+ 适用)
Hive 2.0及以上版本支持to_timestamp函数,它可以正确解析带毫秒的时间字符串并转为timestamp类型。我们可以将timestamp转为double类型(此时值为从 epoch 开始的秒数,包含小数部分表示毫秒),再通过计算得到毫秒级时间差:
select (cast(to_timestamp('2017-12-26 14:35:19.609') as double) - cast(to_timestamp('2017-12-26 14:35:18.779') as double)) * 1000 as timediff;
执行后会输出正确的结果:830。
方法二:手动拆分时间字段(低版本Hive适用)
如果你的Hive版本较低,不支持to_timestamp,可以手动拆分时间字符串的秒部分和毫秒部分,分别计算后再合并:
select ( -- 计算第一个时间的总毫秒数:秒转毫秒 + 提取的毫秒值 (unix_timestamp(substr('2017-12-26 14:35:19.609', 1, 19)) * 1000 + cast(substr('2017-12-26 14:35:19.609', 21, 3) as int)) - -- 计算第二个时间的总毫秒数 (unix_timestamp(substr('2017-12-26 14:35:18.779', 1, 19)) * 1000 + cast(substr('2017-12-26 14:35:18.779', 21, 3) as int)) ) as timediff;
这个方法通过substr提取时间的秒部分(前19位)和毫秒部分(第21位开始的3位),分别转换后相加得到总毫秒数,再相减就能得到准确的毫秒差,同样输出830。
内容的提问来源于stack exchange,提问作者Akhila
相关产品推荐
相关产品推荐

