Aggregates enable users to apply User-defined functions (UDF) to rows in a data set and combine their values into a final result, for example average or standard deviation. SchemaBuilder offers API methods for creating and dropping aggregates.

Creating an aggregate (CREATE AGGREGATE)

To start a CREATE AGGREGATE query, use createAggregate in SchemaBuilder:

import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.*;

CreateAggregateStart create = createAggregate("average");

Like all other CREATE queries, one may supply ifNotExists() to require that the aggregate should only be created if it doesn’t already exist, i.e.:

CreateAggregateStart create = createAggregate("cycling", "average").ifNotExists();

You may also specify that you would like to replace an existing aggregate by the same signature if it exists. In this case, use orReplace:

CreateAggregateStart create = createAggregate("cycling", "average").orReplace();

One may also specify the parameters of an aggregate using withParameter:

CreateAggregateStart create = createAggregate("cycling", "average")

To complete an aggregate, one must then provide the following:

  • The state function (withSFunc) to execute on each row
  • The type of the value returned by the state function (withSType)

In addition, while optional, it is typical that the following is also provided:

  • The final function to be executed after the state function is evaluated against all rows (withFinalFunc)
  • The initial condition (withInitCond) which defines the initial value(s) to be passed in to the first parameter of the state function.

For example, the following defines a complete CREATE AGGREGATE statement:

createAggregate("cycling", "average")
    .withSType(DataTypes.tupleOf(DataTypes.INT, DataTypes.BIGINT))
    .withInitCond(tuple(literal(0), literal(0)));

// CREATE AGGREGATE cycling.average (int) SFUNC avgstate STYPE tuple<int, bigint> FINALFUNC avgfinal INITCOND (0,0)

Dropping an aggregate (DROP AGGREGATE)

To create a DROP AGGREGATE query, use dropAggregate:

dropAggregate("cycling", "average");
// DROP AGGREGATE cycling.average

You may also specify ifExists: