首页/新闻资讯/正文详情

Apache Druid druid-stats 扩展指南:方差与标准差聚合的摄入预聚合与查询实战

发布时间:2026/9/23 17:35:26 来源:云帆数科 栏目:资讯中心
Apache Druid druid-stats 扩展指南:方差与标准差聚合的摄入预聚合与查询实战
Apache Druid druid-stats 扩展指南方差与标准差聚合的摄入预聚合与查询实战【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址: https://gitcode.com/gh_mirrors/druid7/druiddruid-stats 是 Apache Druid 的核心扩展core extension为 Druid 引入方差variance与标准差standard deviation两类统计聚合能力覆盖摄入阶段预聚合与查询阶段合并的全链路。读完本文你将掌握variance聚合器与varianceFold折叠聚合器的 JSON 配置、inputType/estimator参数的语义、stddev后聚合器的用法并能结合源码理解其数值稳定算法的底层实现直接在自己的 Timeseries / TopN / GroupBy 查询中落地。扩展概览与加载方式druid-stats位于仓库的 extensions-core/stats 模块其 Maven artifactId 为druid-stats见 pom.xml。它属于 Druid 打包在发行版中的核心扩展因此无需额外下载 jar只需在common.runtime.properties的druid.extensions.loadList中加入扩展名即可启用druid.extensions.loadList[druid-stats]完整的扩展加载说明见 including-extensions.md核心扩展清单见 extensions.md其中对 druid-stats 的定位描述为Statistics related module including variance and standard deviation。启用后扩展模块 DruidStatsModule.java 会通过 Guice 与 Jackson 完成三件事注册variance、varianceFold、stddev三个 JSON 子类型并为类型名为variance的复杂列注册序列化器VarianceSerde从而打通摄入、存储与查询三个阶段。Variance 聚合器与数值稳定算法variance聚合器计算一组数值的方差其算法与 Apache Hive 的GenericUDAFVariance完全一致源自 Chan、Golub 与 LeVeque 发表于The American Statistician1983, 37: 242–247的论文Algorithms for computing the sample variance: analysis and recommendations。该算法是**增量式incremental**的不要求一次性持有全部原始值而是每来一条数据就更新一组统计量因而天然适合 Druid 的流式/批式聚合场景。其核心合并公式为variance variance1 variance2 n/(m*(mn)) * pow(((m/n)*t1 - t2), 2)各符号含义variance表示sum[x-avg^2]即n 倍方差非样本方差本身每一步都会被更新n为 chunk1 的元素个数m为 chunk2 的元素个数t1为 chunk1 的元素之和t2为 chunk2 的元素之和。该算法的数值稳定性由 J.L. Barlow 在Error analysis of a pairwise summation algorithm to compute sample varianceNumer. Math, 58 (1991) pp. 583–590中证明可有效避免朴素两遍算法在数据量大、均值接近时出现的灾难性抵消问题。源码中的中间状态与增量更新源码 VarianceAggregatorCollector.java 用三个字段承载中间状态countlong元素个数sumdouble元素之和nvariancedoublesum[x-avg^2]即 n 倍方差。单条数据的增量更新add(float/long)在 VarianceAggregatorCollector.java 中实现count; sum v; if (count 1) { double t count * v - sum; nvariance (t * t) / ((double) count * (count - 1)); }两个 chunk 的合并逻辑combineValues则直接对应上文论文公式位于 VarianceAggregatorCollector.java。这正是 Druid 在 Broker、Historical 节点上做跨段segment合并时反复调用的路径也是整个扩展正确性的基石。中间状态大小与序列化由于聚合中间态只有count sum nvariance三个数值其固定大小为Longs.BYTES Doubles.BYTES Doubles.BYTES 24字节见 VarianceAggregatorCollector.java并以紧凑的putLong putDouble putDouble二进制格式落盘toByteBuffer因此相比保留全量原始值再计算内存与磁盘开销非常可控。摄入时预聚合方差Pre-aggregation at Ingestion使用该特性的前提是在索引摄入阶段就必须把variance聚合器写进摄入任务。摄入时的聚合器只能作用于数值类型的指标列若某输入行缺失该指标值会被视为取值0参与计算。摄入阶段variance聚合器的 JSON 结构如下{ type : variance, name : output_name, fieldName : metric_name, inputType : input_type, estimator : string }字段说明属性说明默认值type固定为variance无name聚合结果在输出中的列名无fieldName参与计算的指标列名无inputType期望的输入类型可取float、long、variancefloatestimator设为population时输出总体方差variance_pop否则为样本方差variance_samplenullinputType的默认值与三态分支在源码 VarianceAggregatorFactory.java 与 factorize 中体现float使用FloatVarianceAggregator按 float 列逐行累加long使用LongVarianceAggregator按 long 列逐行累加variance输入本身就是上一步聚合出的VarianceAggregatorCollector对象使用ObjectVarianceAggregator直接做 chunk 合并此时factorize通过makeObjectColumnSelector读取复杂列其余值会抛出IAE异常expected a float, long or variance。与Aggregator对象式并列还有基于ByteBuffer的 VarianceBufferAggregator.java它把count、sum、nvariance按偏移量0 / 8 / 16写入聚合缓冲区用于 Druid 的行式聚合执行路径两种实现共用同一套增量与合并公式。摄入段构建时VarianceSerde.java 的 extractor 会把输入行的原始值解析进VarianceAggregatorCollector支持直接接收 collector 对象也支持把多值维度逐值Float.parseFloat后逐个add最终以复杂列complex column形式存入 segment供后续查询期合并。查询期折叠varianceFold 聚合器如果摄入时已经预聚合了variance即以variance复杂列落盘那么查询时必须用variance类型的聚合器去合并这些中间态。文档给出的推荐写法有两种等价选择在查询中使用inputType为variance的variance聚合器或直接使用简化的varianceFold聚合器{ type : varianceFold, name : output_name, fieldName : metric_name, estimator : string }varianceFold在源码中是 VarianceFoldingAggregatorFactory.java它继承VarianceAggregatorFactory并强制把inputType固定为variance从声明层面保证只做中间态合并、不再解析原始数值。这也解释了为何摄入用variance、查询用varianceFold是一对标准组合——VarianceAggregatorFactory.getCombiningFactory()源码内部返回的正是new VarianceFoldingAggregatorFactory(name, name, estimator)。estimator 参数总体方差与样本方差estimator同时存在于variance、varianceFold与后文的stddev中用于选择方差口径取值含义计算公式源码 getVariancepopulation不区分大小写总体方差variance_popnvariance / count其他值或null默认样本方差variance_samplenvariance / (count - 1)判定逻辑只有一行estimator ! null estimator.equalsIgnoreCase(population)见 VarianceAggregatorCollector.java因此只要不显式传population一律按样本方差处理。建议在摄入与查询两侧保持一致的estimator设置。stddev 后聚合器由方差求标准差要从已聚合的方差结果获得标准差使用stddevpost-aggregator后聚合器{ type: stddev, name: output_name, fieldName: aggregator_name, estimator: string }其实现位于 StandardDeviationPostAggregator.javacompute逻辑即对fieldName指向的方差聚合结果开平方return Math.sqrt(((VarianceAggregatorCollector) combinedAggregators.get(fieldName)).getVariance(isVariancePop));注意fieldName必须指向查询aggregations中某个variance聚合器的name且该聚合器的estimator口径应与 post-aggregator 的estimator一致否则输出的是另一种口径的标准差。查询实战示例以下三类查询示例均来自官方文档可直接在启用了druid-stats的集群上运行数据源名为testing指标为index/index_var。Timeseries 查询按天聚合方差{ queryType: timeseries, dataSource: testing, granularity: day, aggregations: [ { type: variance, name: index_var, fieldName: index_var } ], intervals: [ 2016-03-01T00:00:00.000/2013-03-20T00:00:00.000 ] }TopN 查询按维度 TopN 并附带标准差{ queryType: topN, dataSource: testing, dimensions: [alias], threshold: 5, granularity: all, aggregations: [ { type: variance, name: index_var, fieldName: index } ], postAggregations: [ { type: stddev, name: index_stddev, fieldName: index_var } ], intervals: [ 2016-03-06T00:00:00/2016-03-06T23:59:59 ] }GroupBy 查询按维度分组输出方差与标准差{ queryType: groupBy, dataSource: testing, dimensions: [alias], granularity: all, aggregations: [ { type: variance, name: index_var, fieldName: index } ], postAggregations: [ { type: stddev, name: index_stddev, fieldName: index_var } ], intervals: [ 2016-03-06T00:00:00/2016-03-06T23:59:59 ] }三个示例演示了两种典型搭配直接对原始数值列fieldName: index用variance聚合出方差再通过postAggregations中的stddev派生出标准差index_stddev。若数据已在摄入期预聚合则把查询期聚合器换成varianceFold即可。边界行为与测试验证聚合器的边界行为在源码中有明确规定并有对应测试用例佐证空结果集当count 0时getVariance会抛出IllegalStateException(should not be empty holder)源码注释指出SQL 标准下应返回 null但 Druid 中不应出现该场景单元素count 1时方差按定义返回0d递增校验测试 VarianceAggregatorTest.java 验证了逐条喂入1.1 → 2.7 → 3.5 → 1.3后count/sum/nvariance的递推值以及总体/样本两种口径的结果testCombine还验证了两组 chunk 合并结果与一次性累加的等价性。仓库中另有 VarianceGroupByQueryTest.java、VarianceTimeseriesQueryTest.java、VarianceTopNQueryTest.java、VarianceSerdeTest.java 等端到端测试覆盖三类查询与序列化路径可作为理解或复现本扩展行为的参考。小结druid-stats以 24 字节的紧凑中间态、论文级的数值稳定合并公式为 Druid 补齐了方差与标准差这两类常用统计指标摄入阶段用varianceinputType取float/long预聚合查询阶段用varianceFold合并中间态再以stddev后聚合器输出标准差estimator: population可在总体与样本口径间切换。若你的业务需要按维度求波动率监控指标离散程度等统计型分析这套组合即可无缝嵌入 Druid 的 Timeseries、TopN 与 GroupBy 查询。【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址: https://gitcode.com/gh_mirrors/druid7/druid创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

大秀视频后端高并发优化实战 附完整示例与压测数据
大秀视频后端高并发优化实战 附完整示例与压测数据

大秀视频后端高并发优化实战 附完整示例与压测数据 刚接手大秀视频直播后台时,最头疼的不是业务逻辑,而是监控大屏上那条随时可能爆表的 CPU 曲线。凌晨三点,报警电话响个不停,翻开日志全是… · 2026/9/23 17:35:20

DeepSeek-R1本地知识库实战:RAG端到端部署指南
DeepSeek-R1本地知识库实战:RAG端到端部署指南

简介:本资源是一份面向AI开发者与技术实践者的本地知识库构建指南,聚焦DeepSeek-R1大模型在RAG(检索增强生成)场景下的轻量级落地应用。文档系统讲解如何利用Ollama部署DeepSeek-R1、Nomic-Embed-Text向量模型及AnythingLLM平台&a… · 2026/9/23 17:35:08

三星曲面常见报错与解决
三星曲面常见报错与解决

三星曲面报错速查手册:3个高频坑点与底层逻辑 面对满屏的 StackTrace,眼睛发花还是第一反应?别慌。这套三星曲面常见报错速查手册,就是为你准备的救命稻草。很多开发者盯着红色报错行,却找不到根源,往往是因为没看透框架底层的响应机制。今… · 2026/9/23 17:35:07

Fn键本质是硬件级键位映射切换开关
Fn键本质是硬件级键位映射切换开关

1. Fn键不是“隐藏功能”,而是被系统刻意设计的交互分层机制Fn键,全称Function Key,中文常被叫作“功能键”或“组合键开关”,但它既不是快捷键,也不是传统意义上的修饰键(Modifier Key)——它和… · 2026/9/23 18:14:03

5个坑搞定盛大网络热血传奇官网性能优化
5个坑搞定盛大网络热血传奇官网性能优化

5个坑搞定盛大网络热血传奇官网性能优化 看了一堆教程还是不会写项目?别慌,这不是你的错,是教程太“理想化”了。很多老手在 掘金技术社区… · 2026/9/23 18:13:57

Win11任务栏秒针显示:系统级时间精度增强指南
Win11任务栏秒针显示:系统级时间精度增强指南

1. 这不是“隐藏彩蛋”,而是Win11真内置功能:任务栏秒针显示的来龙去脉你有没有在某个深夜加班时,盯着右下角那个跳动的时钟,突然发现——咦?它居然在动?不是每分钟跳一下,而是实实在在的“滴、… · 2026/9/23 18:13:51

4v1选型避坑指南:新手别再乱抄代码了
4v1选型避坑指南:新手别再乱抄代码了

4v1选型避坑指南:新手别再乱抄代码了 刚接手项目,从网上抄了一段 4v1 数据聚合代码,结果一跑就报错?别急,这坑我踩过,你也别急。很多新手一上来就找“通用模板”,结果发现根本跑不通,连报错信息都看不懂,更别提怎么调了。 做 4v1… · 2026/9/23 18:13:50

学生党变声整活实测|4 款变声器横评,手机电脑全都有,一次搞定
学生党变声整活实测|4 款变声器横评,手机电脑全都有,一次搞定

最近刷短视频总能刷到变声整活,不管是联机游戏语音、和室友线上开玩笑,还是给自己短视频配趣味旁白,变声器直接把氛围感拉满。很多同学来问,市面上这么多变声软件,到底该选哪一个?我陆续试了 4 款热门工具&… · 2026/9/23 18:13:44

JSP+Servlet+JavaBean老项目拆解:从源码结构到二次开发
JSP+Servlet+JavaBean老项目拆解:从源码结构到二次开发

简介:面向全国计算机等级考试二级Office辅导答疑场景,这套基于JSP与Java的完整项目源代码,适合Web开发学习者、毕业设计者以及需要搭建在线练习答疑平台的开发者。压缩包共1568个文件、约38.12MB,主要包含jsp页面、Java类、jar依赖… · 2026/9/23 18:13:44

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码