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

  1. Replace floatAny in the metricsSpec with a rollup-supported aggregator (floatSum, floatMin, floatMax, floatFirst)
  2. Disable rollup on the datasource if the exact arbitrary value must be preserved
  3. Apply floatAny only at query time against already-rolled-up data
  4. 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

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


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/dde0f5d01d8ff423. Report an issue: GitHub.