Druid Roll Up功能未按预期工作的原因排查
Druid Kafka摄入后同一维度组合出现多条聚合结果问题分析
问题描述
配置了从Kafka读取数据的Druid摄入规范,指定按分钟粒度Roll Up,维度为PURCHASE_STATUS和STORE_ID,仅统计count指标,但查询时同一时间桶、同一维度组合出现多条聚合记录。
摄入规范
{ "type": "kafka", "spec": { "dataSchema": { "dataSource": "purchase", "timestampSpec": { "column": "timestamp", "format": "millis", "missingValue": "1970-01-01T00:00:00.000Z" }, "dimensionsSpec": { "dimensions": [ { "type": "string", "name": "PURCHASE_STATUS", "multiValueHandling": "SORTED_ARRAY", "createBitmapIndex": true }, { "type": "string", "name": "STORE_ID", "multiValueHandling": "SORTED_ARRAY", "createBitmapIndex": true } ], "dimensionExclusions": [ "__time", "total_count", "timestamp" ], "includeAllDimensions": false }, "metricsSpec": [ { "type": "count", "name": "total_count" } ], "granularitySpec": { "type": "uniform", "segmentGranularity": "TEN_MINUTE", "queryGranularity": "MINUTE", "rollup": true, "intervals": [] } } } }
查询语句
SELECT __time, STORE_ID, PURCHASE_STATUS, total_count FROM mz_purchase WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '30' MINUTE ORDER BY __time DESC
查询结果
2022-12-07T06:37:00.000Z 1 Status1 3 2022-12-07T06:37:00.000Z 1 Status2 2 2022-12-07T06:37:00.000Z 1 Status1 1 2022-12-07T06:37:00.000Z 1 Status3 23
问题原因及解决办法
1. 实时摄入的中间segment未合并
Druid Kafka实时任务运行时,会先生成未完全合并的中间segment,只有当segment达到大小或时间阈值后,才会触发后台compaction操作合并同一维度的聚合结果。
- 解决:等待自动compaction完成,或手动触发compaction任务;也可调整Kafka摄入任务的
maxRowsPerSegment、maxTotalRows参数,让segment更快满足合并条件。
2. 维度值存在隐式差异
表面相同的维度值可能包含空格、大小写不一致、特殊字符等细微差异,Druid会将其视为不同维度值。
- 解决:在摄入阶段添加数据清洗逻辑,比如通过
transformSpec统一处理维度值:
将上述配置添加到"transformSpec": { "transforms": [ { "type": "expression", "name": "PURCHASE_STATUS", "expression": "trim(PURCHASE_STATUS)" }, { "type": "expression", "name": "STORE_ID", "expression": "trim(STORE_ID)" } ] }dataSchema下,与timestampSpec同级。
3. 查询未显式触发聚合
实时查询若未强制聚合,可能返回中间状态的原始聚合结果。
- 解决:修改查询语句,显式按分钟和维度分组聚合:
SELECT TIME_FLOOR(__time, 'PT1M') AS minute_time, STORE_ID, PURCHASE_STATUS, SUM(total_count) AS total_count FROM mz_purchase WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '30' MINUTE GROUP BY minute_time, STORE_ID, PURCHASE_STATUS ORDER BY minute_time DESC
4. 多值维度配置不匹配
维度配置了multiValueHandling: SORTED_ARRAY,若原始数据并非多值字段,会导致不必要的数组拆分,引发聚合异常。
- 解决:确认原始数据字段类型,若为单值字段,将
multiValueHandling改为SINGLE_VALUE。
内容的提问来源于stack exchange,提问作者user12331
相关产品推荐
相关产品推荐

