Druid原生查询与Druid SQL时序查询空桶处理默认行为差异咨询
Druid原生查询与SQL空桶填充默认逻辑差异原因
这个默认值不一致不是SQL转原生查询的逻辑bug,是Druid团队为了兼容两类用户的使用习惯刻意做的设计:
- 原生Timeseries查询是Druid上线之初就存在的专属查询类型,最早的定位就是给时序监控、指标看板场景用的,从第一个版本开始就默认做查询区间内的空桶零填充。这个行为已经沿用了十几年,大量存量业务的告警规则、报表逻辑直接依赖这个默认返回,根本不能改,一改就会导致线上数据错乱,所以原生查询层至今保持
skipEmptyBuckets = false的默认值,也就是不跳过空桶、自动补零。 - Druid SQL是后来才加的模块,设计目标就是完全对齐ANSI SQL的标准行为。你用任何标准SQL数据库写时间分组聚合,没有数据的时间桶本来就不会出现在结果里,这是所有SQL用户的通用认知。如果Druid SQL默认开零填充,反而会让从其他数据库迁过来的用户觉得结果不对,所以SQL层在把SQL语句转成原生查询的时候,会主动给查询上下文加上
skipEmptyBuckets = true的配置,覆盖原生层的默认值,返回符合SQL直觉的结果。
如果你在Superset里需要零填充效果,不用等官方做专门的配置入口,直接在Druid连接的自定义参数、SQL查询的前置配置里加上对应的上下文参数就能覆盖默认设置,拿到补全所有时间桶的结果。
补充说明:零填充对应的参数值需要注意,
skipEmptyBuckets设为true时代表跳过空桶,要开启零填充需要把这个参数设为false。
内容的提问来源于stack exchange,提问作者Jimmy Lu
相关产品推荐
相关产品推荐

