Apache Druid如何按单字段groupBy并在同一行返回多组聚合值
Apache Druid 单维度groupBy返回多维度统计问题解答
核心问题答复
- 按单个列执行
groupBy操作时,完全可以返回其他维度的统计结果,不需要将额外统计维度加入分组维度列表。 - 要在单维度groupBy的结果行中返回不同维度的分组统计项,使用
filtered类型聚合器即可实现,之前尝试未生效是查询写法存在错误,并非方案不可行。
原有查询的错误点
- JSON语法错误:多处键名错误将冒号写在了引号内部,比如
"context:"、"type: "count"这类写法会导致配置无法被Druid正常解析,新增的聚合器配置根本没有生效。 - 聚合器配置错误:
filtered聚合器内部嵌套的count类型聚合器不需要指定fieldName,count聚合器的逻辑是统计符合条件的行数,无需绑定特定字段。 - 聚合器选型错误:
grouping聚合器的作用是多维度分组时标识当前结果行的聚合维度层级,完全不适用单维度分组下的条件统计场景,所以达不到预期效果。
正确查询示例
以下是修正后的可直接运行的native查询写法,按userId分组的同时,会在同一行返回总计数、不同block_id对应的计数:
{ "queryType": "groupBy", "dataSource": "my-data-source", "granularity": "all", "intervals": ["2022-06-27T03:00:00.000Z/2022-06-28T03:00:00.000Z"], "context": { "timeout": 30000 }, "dimensions": ["userId"], "filter": { "type": "and", "fields": [ {"type": "or", "fields": [{}]} ] }, "aggregations": [ {"type": "count", "name": "total_count"}, { "type": "filtered", "filter": {"type": "selector", "dimension": "block_id", "value": "block1"}, "aggregator": {"type": "count", "name": "block1_count"} }, { "type": "filtered", "filter": {"type": "selector", "dimension": "block_id", "value": "block2"}, "aggregator": {"type": "count", "name": "block2_count"} } ] }
如果需要统计其他维度的分组项,只需要按照上述filtered聚合器的格式,在aggregations数组中追加对应过滤条件的配置即可。
预期效果参考

内容的提问来源于stack exchange,提问作者PlayHardGoPro
相关产品推荐
相关产品推荐

