请说明在 Apache Druid 中,维度和度量分别是如何定义和配置的?
考察说明
考查对 Druid 数据模型核心概念(维度和度量)定义方式的理解。
回答思路
- 【回答框架 1】维度是用于过滤、分组和聚合的字段,通常在 ingestion 阶段通过 DataSource 的 schema 指定。度量是数值型字段,用于聚合计算,如 sum、max、min、count 等,定义时需指定聚合函数。
- 【回答框架 2】在 Druid 的 ingestion spec 中,维度和度量通过 dataSchema 的 dimensionsSpec 和 metricsSpec 定义。dimensionsSpec 可设置维度字段列表,支持多值维度和包含/排除规则;metricsSpec 定义度量名、输入字段和聚合器类型。
- 【回答框架 3】实际配置时,维度列会作为 Segments 的索引列,提升查询过滤效率;度量列则被聚合存储,减少存储开销。定义时需注意维度不宜过多,避免基数过高影响压缩和查询性能。
- 【回答框架 4】定义完成后,Druid 会根据维度构建反向索引,并预聚合度量值。查询时,维度用于 groupBy 和 filter,度量用于 aggregations 和 post-aggregations。
- 【关键点 1】维度定义在 dimensionsSpec 中,支持多值维度和白名单/黑名单。
- 【关键点 2】度量定义在 metricsSpec 中,必须指定聚合函数(如 longSum、doubleMax)。
- 【关键点 3】维度用于过滤和分组,度量用于数值聚合。
- 【关键点 4】维度数量过多会增加存储和查询开销,需合理设计。
- 【易错点 1】混淆维度与度量:度量必须是数值类型,且要给出聚合函数,否则无法进行预聚合。
- 【易错点 2】忽略维度基数控制,高基数维度(如用户 ID)会导致索引膨胀和查询变慢。