2013-09-16 17:49:36 -04:00
---
2013-09-26 19:22:28 -04:00
layout: doc_page
2013-09-16 17:49:36 -04:00
---
2014-01-16 18:37:07 -05:00
# Post-Aggregations
2013-09-13 18:20:39 -04:00
Post-aggregations are specifications of processing that should happen on aggregated values as they come out of Druid. If you include a post aggregation as part of a query, make sure to include all aggregators the post-aggregator requires.
There are several post-aggregators available.
### Arithmetic post-aggregator
The arithmetic post-aggregator applies the provided function to the given fields from left to right. The fields can be aggregators or other post aggregators.
Supported functions are `+` , `-` , `*` , and `/`
The grammar for an arithmetic post aggregation is:
2013-09-27 20:08:34 -04:00
```json
postAggregation : {
"type" : "arithmetic",
"name" : < output_name > ,
"fn" : < arithmetic_function > ,
"fields": [< post_aggregator > , < post_aggregator > , ...]
}
```
2013-09-13 18:20:39 -04:00
### Field accessor post-aggregator
2013-09-27 20:08:34 -04:00
This returns the value produced by the specified [aggregator ](Aggregations.html ).
2013-09-13 18:20:39 -04:00
2013-09-27 20:08:34 -04:00
`fieldName` refers to the output name of the aggregator given in the [aggregations ](Aggregations.html ) portion of the query.
2013-09-13 18:20:39 -04:00
2013-09-27 20:08:34 -04:00
```json
{ "type" : "fieldAccess", "fieldName" : < aggregator_name > }
```
2013-09-13 18:20:39 -04:00
### Constant post-aggregator
The constant post-aggregator always returns the specified value.
2013-09-27 20:08:34 -04:00
```json
{ "type" : "constant", "name" : < output_name > , "value" : < numerical_value > }
```
2013-09-13 18:20:39 -04:00
2013-11-07 18:19:39 -05:00
### JavaScript post-aggregator
Applies the provided JavaScript function to the given fields. Fields are passed as arguments to the JavaScript function in the given order.
```json
postAggregation : {
"type": "javascript",
"name": < output_name > ,
"fieldNames" : [< aggregator_name > , < aggregator_name > , ...],
"function": < javascript function >
}
```
Example JavaScript aggregator:
```json
{
"type": "javascript",
"name": "absPercent",
"fieldNames": ["delta", "total"],
"function": "function(delta, total) { return 100 * Math.abs(delta) / total; }"
}
```
2014-03-05 17:19:38 -05:00
### `hyperUniqueCardinality` post-aggregator
The hyperUniqueCardinality post aggregator is used to wrap a hyperUnique object such that it can be used in post aggregations.
```json
{ "type" : "hyperUniqueCardinality", "fieldName" : < the name field value of the hyperUnique aggregator > }
```
It can be used in a sample calculation as so:
```json
"aggregations" : [{
{"type" : "count", "name" : "rows"},
{"type" : "hyperUnique", "name" : "unique_users", "fieldName" : "uniques"}
}],
"postAggregations" : {
"type" : "arithmetic",
"name" : "average_users_per_row",
"fn" : "/",
"fields" : [
{ "type" : "hyperUniqueCardinality", "fieldName" : "unique_users" },
{ "type" : "fieldAccess", "name" : "rows", "fieldName" : "rows" }
]
}
```
2013-11-07 18:19:39 -05:00
2013-09-13 18:20:39 -04:00
### Example Usage
2013-09-27 20:08:34 -04:00
In this example, let’ s calculate a simple percentage using post aggregators. Let’ s imagine our data set has a metric called "total".
2013-09-13 18:20:39 -04:00
The format of the query JSON is as follows:
2013-09-27 20:08:34 -04:00
```json
{
...
"aggregations" : [
{ "type" : "count", "name" : "rows" },
{ "type" : "doubleSum", "name" : "tot", "fieldName" : "total" }
],
"postAggregations" : {
"type" : "arithmetic",
"name" : "average",
"fn" : "*",
"fields" : [
{ "type" : "arithmetic",
"name" : "div",
"fn" : "/",
"fields" : [
{ "type" : "fieldAccess", "name" : "tot", "fieldName" : "tot" },
{ "type" : "fieldAccess", "name" : "rows", "fieldName" : "rows" }
]
},
{ "type" : "constant", "name": "const", "value" : 100 }
]
}
...
}
2014-03-05 17:19:38 -05:00
```