公司的数据处理是用的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')
|