Hive时间戳的踩坑

公司的数据处理是用的Spark on Hive, 在处理时间戳的时候,又踩了坑。在一个过滤条件中,带毫秒的时间戳没有得到期待的结果。

比如下面的SQL中,按照理解49ms早于118毫秒的,所以SQL执行结果是 True,但实际结果却是False

1
2
3
select 
cast('2022-05-19 21:09:24.49' as timestamp) <= cast('2022-05-19 21:09:24.118' as timestamp)
;

若想要得到期待的结果,需要转换成13位的,带毫秒的时间戳,再进行转换。

可以使用如下的方式(其中ts2ms为自定义UDF函数):

1
2
3
select
ts2ms(cast('2022-05-19 21:09:24.49' as timestamp), 'yyyy-MM-dd HH:mm:ss.SSS') <=
ts2ms(cast('2022-05-19 21:09:24.118' as timestamp), 'yyyy-MM-dd HH:mm:ss.SSS')