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 cleanupView on GitHub (pinned to 9b90983fd2)
Solutions
- Call get() and extract the estimate from the returned HyperLogLogCollector object
- Use the cardinality aggregator only in contexts that treat its output as an object/string estimate
- 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
- Treat cardinality aggregations as object-typed (HyperLogLogCollector)
- Use hyperUnique/cardinality results only via finalized estimates
- Never use cardinality aggregators where float output columns are expected
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
- CardinalityAggregator does not support getLong()
- CardinalityAggregator does not support getDouble()
- CardinalityBufferAggregator does not support getFloat()
- CardinalityBufferAggregator does not support getLong()
- CardinalityBufferAggregators does not support getDouble()
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/34b5f0e53fb5ce0d.
Report an issue: GitHub.