apache/druid · error · java.lang.UnsupportedOperationException

CardinalityAggregator does not support getFloat()

Error message

CardinalityAggregator does not support getFloat()

What it means

CardinalityAggregator computes HyperUnique (HLL sketch-based) distinct counts and exposes its result only via get() as a HyperLogLogCollector/object. getFloat() is deliberately unsupported and throws UnsupportedOperationException.

Source

Thrown at processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityAggregator.java:106

    if (byRow) {
      hashRow(selectorPluses, collector);
    } else {
      hashValues(selectorPluses, collector);
    }
  }

  @Override
  public synchronized Object get()
  {
    // Must make a new collector duplicating the underlying buffer to ensure the object from "get" is usable
    // in a thread-safe manner.
    return HyperLogLogCollector.makeCollectorSharingStorage(collector);
  }

  @Override
  public float getFloat()
  {
    throw new UnsupportedOperationException("CardinalityAggregator does not support getFloat()");
  }

  @Override
  public long getLong()
  {
    throw new UnsupportedOperationException("CardinalityAggregator does not support getLong()");
  }

  @Override
  public double getDouble()
  {
    throw new UnsupportedOperationException("CardinalityAggregator does not support getDouble()");
  }

  @Override
  public void close()
  {
    // no resources to cleanup

View on GitHub (pinned to 9b90983fd2)

Solutions

  1. Call get() and extract the estimate from the returned HyperLogLogCollector object
  2. Use the cardinality aggregator only in contexts that treat its output as an object/string estimate
  3. Use a numeric aggregator (e.g. doubleSum) if a float-typed result is needed

Example fix

// before
float v = aggregator.getFloat();
// after
Object v = aggregator.get(); // HyperLogLogCollector / estimate
Defensive patterns

Strategy: type-guard

Validate before calling

if (!(aggFactory instanceof CardinalityAggregatorFactory)) { float v = aggregator.getFloat(); }

Type guard

if (aggregator instanceof CardinalityAggregator) {
    Object v = aggregator.get(); // HLL sketch/estimate
} else {
    float v = aggregator.getFloat();
}

Try / catch

try {
    v = aggregator.getFloat();
} catch (UnsupportedOperationException e) {
    v = Float.NaN; // fall back to get() + estimate extraction
}

Prevention

When it happens

Trigger: Calling aggregator.getFloat() on a CardinalityAggregator instance created by CardinalityAggregatorFactory, e.g. when the query layer resolves the aggregation's type as FLOAT.

Common situations: Attempting to read a cardinality aggregation result as a float in custom aggregation code or a numeric post-aggregator; misuse in rollup/ingestion numeric extraction.

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/34b5f0e53fb5ce0d. Report an issue: GitHub.