apache/druid · error · UnsupportedOperationException
FloatAnyAggregatorFactory is not supported during ingestion
Error message
FloatAnyAggregatorFactory is not supported during ingestion for rollup
What it means
FloatAnyAggregatorFactory cannot participate in rollup: the float 'any' aggregator has no deterministic combine semantics across cursors, so Druid's ingestion-time AggregateCombiner is intentionally unsupported and makeAggregateCombiner throws UOE with this message. Query-time use of floatAny remains fine; only rollup ingestion rejects it.
Source
Thrown at processing/src/main/java/org/apache/druid/query/aggregation/any/FloatAnyAggregatorFactory.java:148
}
@Override
public Comparator getComparator()
{
return FloatSumAggregator.COMPARATOR;
}
@Override
@Nullable
public Object combine(@Nullable Object lhs, @Nullable Object rhs)
{
return lhs;
}
@Override
public AggregateCombiner makeAggregateCombiner()
{
throw new UOE("FloatAnyAggregatorFactory is not supported during ingestion for rollup");
}
@Override
public AggregatorFactory getCombiningFactory()
{
return new FloatAnyAggregatorFactory(name, name);
}
@Override
public Object deserialize(Object object)
{
// handle "NaN" / "Infinity" values serialized as strings in JSON
if (object instanceof String) {
return Float.parseFloat((String) object);
}
return object;
}View on GitHub (pinned to 9b90983fd2)
Solutions
- Replace floatAny in the metricsSpec with a rollup-supported aggregator (floatSum, floatMin, floatMax, floatFirst)
- Disable rollup on the datasource if the exact arbitrary value must be preserved
- Apply floatAny only at query time against already-rolled-up data
- Use floatFirst as a deterministic stand-in when only one row rolls into each key
Example fix
// before
"metricsSpec": [{ "type": "floatAny", "name": "v" }]
// after
"metricsSpec": [{ "type": "floatSum", "name": "v" }] // or turn rollup off Defensive patterns
Strategy: validation
Validate before calling
boolean rollupSafe(IngestionSpec spec) {
return spec.metricsSpec.stream().noneMatch(a ->
"floatAny".equals(a.getType()) && spec.rollup);
} Type guard
boolean isRollupCompatible(AggregatorFactory f) {
return !(f instanceof FloatAnyAggregatorFactory);
} Try / catch
try {
indexBuilder.addAggregator(factory);
} catch (UnsupportedOperationException e) {
LOGGER.error(e, "Aggregator %s unsupported for rollup ingestion", factory.getName());
throw new ISE("Replace floatAny with a rollup-compatible aggregator");
} Prevention
- Exclude floatAny from rollup ingestion specs; use floatSum/Min/Max/First
- Apply any-aggregations only at query time
- Turn rollup off when arbitrary value retention is a hard requirement
- Audit templated/generated metricsSpec entries for any-aggregator types
When it happens
Trigger: Ingestion job with rollup enabled whose metricsSpec contains a float aggregator with fn "any" (floatAny); the incremental index construction calls makeAggregateCombiner and throws immediately.
Common situations: Copying a query spec into an ingestion metricsSpec; migrating legacy datasources that used any-aggregators at query time into rollup-based ingestion without changing the aggregator type.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- DoubleAnyAggregatorFactory is not supported during ingestion
- LongAnyAggregatorFactory is not supported during ingestion f
- Bloom filter aggregators are query-time only
- %s cannot be used for perfect rollup
- Not implemented
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/dde0f5d01d8ff423.
Report an issue: GitHub.