如何高效地以毫秒精度查询Apache Druid的__time字段?
问题解答
1. 毫秒精度过滤__time列且不牺牲查询效率
针对字符串时间解析被截断到秒级导致过滤不准确的问题,有两种高效解决方案:
使用ANSI TIMESTAMP字面量
直接用TIMESTAMP '时间字符串'格式替代纯字符串字面量,Druid会保留毫秒精度解析时间,同时能直接利用__time字段的索引,不会损失查询效率:SELECT * FROM my_table WHERE __time >= TIMESTAMP '2023-10-19T09:29:58.613Z' AND __time <= TIMESTAMP '2023-10-19T09:30:13.613Z' AND my_string_field = 'value'基于毫秒数值对比
将目标时间转换为毫秒级时间戳(比如2023-10-19T09:29:58.613Z对应1697700598613),通过TIMESTAMP_TO_MILLIS(__time)与数值对比。Druid对这类基于索引字段的表达式有优化,不会触发全表扫描:SELECT * FROM my_table WHERE TIMESTAMP_TO_MILLIS(__time) >= 1697700598613 AND TIMESTAMP_TO_MILLIS(__time) <= 1697700613613 AND my_string_field = 'value'
2. MILLIS_TO_TIMESTAMP的异常行为
你遇到的MILLIS_TO_TIMESTAMP(1697794200930)返回秒级截断结果的问题,是Druid的已知bug,该问题在25.0.0版本中已被修复。升级到该版本及以上后,直接传入毫秒数值调用MILLIS_TO_TIMESTAMP会正确保留毫秒精度。
内容的提问来源于stack exchange,提问作者Sergey Zakharov
相关产品推荐
相关产品推荐

