## 聚合(Aggregations) > [!WARNING] > Apache Druid支持两种查询语言: [Druid SQL](druidsql.md) 和 [原生查询](makeNativeQueries.md)。该文档描述了原生查询中的一种查询方式。 对于Druid SQL中使用的该种类型的信息,可以参考 [SQL文档](druidsql.md)。 聚合可以在摄取时作为摄取规范的一部分提供,作为在数据进入Apache Druid之前汇总数据的一种方式。聚合也可以在查询时指定为许多查询的一部分。 可用聚合包括: ### Count聚合器 `count`计算了过滤器匹配到行的总数: ```json { "type" : "count", "name" : } ``` 请注意计数聚合器计算Druid的行数,这并不总是反映摄取的原始事件数。这是因为Druid可以配置为在摄取时汇总数据。要计算摄取的数据行数,请在摄取时包括`count`聚合器,在查询时包括`longSum`聚合器。 ### Sum聚合器 **`longSum`** 计算64位有符号整数的和 ```json { "type" : "longSum", "name" : , "fieldName" : } ``` `name` 为求和后值的输出名 `fieldName` 为需要求和的指标列 **`doubleSum`** 计算64位浮点数的和,与`longSum`相似 ```json { "type" : "doubleSum", "name" : , "fieldName" : } ``` **`floatSum`** 计算32位浮点数的和,与`longSum`和`doubleSum`相似 ```json { "type" : "floatSum", "name" : , "fieldName" : } ``` ### Min/Max聚合器 **`doubleMin`** `doubleMin`计算所有指标值与Double.POSITIVE_INFINITY相比的较小者 ```json { "type" : "doubleMin", "name" : , "fieldName" : } ``` **`doubleMax`** `doubleMax`计算所有指标值与Double.NEGATIVE_INFINITY相比的较大者 ```json { "type" : "doubleMax", "name" : , "fieldName" : } ``` **`floatMin`** `floatMin`计算所有指标值与Float.POSITIVE_INFINITY相比的较小者 ```json { "type" : "floatMin", "name" : , "fieldName" : } ``` **`floatMax`** `floatMax`计算所有指标值与Float.NEGATIVE_INFINITY相比的较大者 ```json { "type" : "floatMax", "name" : , "fieldName" : } ``` **`longMin`** `longMin`计算所有指标值与Long.MAX_VALUE的较小者 ```json { "type" : "longMin", "name" : , "fieldName" : } ``` **`longMax`** `longMax`计算所有指标值与Long.MIN_VALUE的较大者 ```json { "type" : "longMax", "name" : , "fieldName" : } ``` **`doubleMean`** 计算并返回列值的算术平均值作为64位浮点值。这只是一个查询时聚合器,不应在摄入期间使用。 ```json { "type" : "doubleMean", "name" : , "fieldName" : } ``` ### First/Last聚合器 Double/Float/Long的First/Last聚合器不能够使用在摄入规范中,只能指定为查询时的一部分。 需要注意,在启用了rollup的段上进行带有first/last聚合器查询将返回汇总后的值,并不是返回原始数据的最后一个值。 **`doubleFirst`** `doubleFirst`计算最小时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "doubleFirst", "name" : , "fieldName" : } ``` **`doubleLast`** `doubleLast`计算最大时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "doubleLast", "name" : , "fieldName" : } ``` **`floatFirst`** `floatFirst`计算最小时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "floatFirst", "name" : , "fieldName" : } ``` **`floatLast`** `floatLast`计算最大时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "floatLast", "name" : , "fieldName" : } ``` **`longFirst`** `longFirst`计算最小时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "longFirst", "name" : , "fieldName" : } ``` **`longLast`** `longLast`计算最大时间戳的指标值,如果不存在行的话,默认为0或者SQL兼容下是`null` ```json { "type" : "longLast", "name" : , "fieldName" : , } ``` **`stringFirst`** `stringFirst` 计算最小时间戳的维度值,行不存在的话为`null` ```json { "type" : "stringFirst", "name" : , "fieldName" : , "maxStringBytes" : # (optional, defaults to 1024) } ``` **`stringLast`** `stringLast` 计算最大时间戳的维度值,行不存在的话为`null` ```json { "type" : "stringLast", "name" : , "fieldName" : , "maxStringBytes" : # (optional, defaults to 1024) } ``` ### ANY聚合器 Double/Float/Long/String的ANY聚合器不能够使用在摄入规范中,只能指定为查询时的一部分。 返回包括null在内的任何值。此聚合器可以通过返回第一个遇到的值(包括null)来简化和优化性能 **`doubleAny`** `doubleAny`返回所有double类型的指标值 ```json { "type" : "doubleAny", "name" : , "fieldName" : } ``` **`floatAny`** `floatAny`返回所有float类型的指标值 ```json { "type" : "floatAny", "name" : , "fieldName" : } ``` **`longAny`** `longAny`返回所有long类型的指标值 ```json { "type" : "longAny", "name" : , "fieldName" : , } ``` **`stringAny`** `stringAny`返回所有string类型的指标值 ```json { "type" : "stringAny", "name" : , "fieldName" : , "maxStringBytes" : # (optional, defaults to 1024), } ``` ### JavaScript聚合器 计算一组列上的任意JavaScript函数(同时允许指标和维度)。JavaScript函数应该返回浮点值。 ```json { "type": "javascript", "name": "", "fieldNames" : [ , , ... ], "fnAggregate" : "function(current, column1, column2, ...) { return }", "fnCombine" : "function(partialA, partialB) { return ; }", "fnReset" : "function() { return ; }" } ``` 实例: ```json { "type": "javascript", "name": "sum(log(x)*y) + 10", "fieldNames": ["x", "y"], "fnAggregate" : "function(current, a, b) { return current + (Math.log(a) * b); }", "fnCombine" : "function(partialA, partialB) { return partialA + partialB; }", "fnReset" : "function() { return 10; }" } ``` > [!WARNING] > 基于JavaScript的功能默认是禁用的。 如何启用它以及如何使用Druid JavaScript功能,参考 [JavaScript编程指南](../development/JavaScript.md)。 ### 近似聚合(Approximate Aggregations) #### 唯一计数(Count distinct) **Apache DataSketches Theta Sketch** 聚合器提供的[DataSketches Theta Sketch扩展](../configuration/core-ext/datasketches-theta.md) 使用[Apache Datasketches库](https://datasketches.apache.org/) 中的Theta Sketch提供不同的计数估计,并支持集合并集、交集和差分后置聚合器。 **Apache DataSketches HLL Sketch** 聚合器提供的[DataSketches HLL Sketch扩展](../configuration/core-ext/datasketches-hll.md)使用HyperLogLog算法给出不同的计数估计。 与Theta草图相比,HLL草图不支持set操作,更新和合并速度稍慢,但需要的空间要少得多 **Cardinality, hyperUnique** > [!WARNING] > 对于新的场景,我们推荐评估使用 [DataSketches Theta Sketch扩展](../configuration/core-ext/datasketches-theta.md) 和 [DataSketches HLL Sketch扩展](../configuration/core-ext/datasketches-hll.md) 来替代。 DataSketch聚合器通常情况下比经典的Druid `cardinality` 和 `hyperUnique` 聚合器提供更弹性的和更好的精确度。 Cardinality和HyperUnique聚合器是在Druid中默认提供的较旧的聚合器实现,它们还使用HyperLogLog算法提供不同的计数估计。较新的数据集Theta和HLL扩展提供了上述聚合器,具有更高的精度和性能,因此建议改为使用。 DataSketches团队已经发表了一篇关于Druid原始HLL算法和DataSketches HLL算法的比较研究。基于数据集实现已证明的优势,我们建议优先使用它们,而不是使用Druid最初基于HLL的聚合器。但是,为了确保向后兼容性,我们将继续支持经典聚合器。 请注意,`hyperUnique`聚合器与Detasketches HLL或Theta sketches不相互兼容。 **多列操作(multi-column handling)** #### 直方图与中位数 ### 其他聚合 #### 过滤聚合器