apache/druid · error · java.lang.UnsupportedOperationException

CardinalityBufferAggregator does not support getFloat()

Error message

CardinalityBufferAggregator does not support getFloat()

What it means

CardinalityBufferAggregator aggregates HLL sketches into a ByteBuffer and only supports reading the sketch via get(). getFloat() throws UnsupportedOperationException because no float primitive is stored.

Solutions

  1. Read the sketch via get(buf, position) (HyperUniquesBufferAggregator.doGet) instead of getFloat()
  2. Use the cardinality aggregation only with object/string-typed result handling
  3. Choose a numeric aggregator if a float result is required

Example fix

// before
float v = bufferAggregator.getFloat(buf, position);
// after
Object v = bufferAggregator.get(buf, position); // HLL sketch
Defensive patterns

Strategy: type-guard

Validate before calling

if (!(aggFactory instanceof CardinalityAggregatorFactory)) { float v = bufferAggregator.getFloat(buf, position); }

Type guard

if (factory instanceof CardinalityAggregatorFactory) {
    Object v = bufferAggregator.get(buf, position);
} else {
    float v = bufferAggregator.getFloat(buf, position);
}

Try / catch

try {
    v = bufferAggregator.getFloat(buf, position);
} catch (UnsupportedOperationException e) {
    v = Float.NaN;
}

Prevention

When it happens

Trigger: Calling bufferAggregator.getFloat(buf, position) on a CardinalityAggregatorFactory-created buffer aggregator, i.e. when the query engine resolves the aggregation type as FLOAT.

Common situations: Vectorized/numeric result extraction on a cardinality aggregation; custom code assuming all buffer aggregators expose numeric getters.

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

Appendix: source

Thrown at processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityBufferAggregator.java:85

        CardinalityAggregator.hashValues(selectorPluses, collector);
      }
    }
    finally {
      buf.limit(oldLimit);
      buf.position(oldPosition);
    }
  }

  @Override
  public Object get(ByteBuffer buf, int position)
  {
    return HyperUniquesBufferAggregator.doGet(buf, position);
  }

  @Override
  public float getFloat(ByteBuffer buf, int position)
  {
    throw new UnsupportedOperationException("CardinalityBufferAggregator does not support getFloat()");
  }


  @Override
  public long getLong(ByteBuffer buf, int position)
  {
    throw new UnsupportedOperationException("CardinalityBufferAggregator does not support getLong()");
  }

  @Override
  public double getDouble(ByteBuffer buf, int position)
  {
    throw new UnsupportedOperationException("CardinalityBufferAggregators does not support getDouble()");
  }

  @Override
  public void close()
  {

View on GitHub (pinned to 9b90983fd2)