{"record":{"id":"34b5f0e53fb5ce0d","repo":"apache/druid","slug":"cardinalityaggregator-does-not-support-getfloat","errorCode":null,"errorMessage":"CardinalityAggregator does not support getFloat()","messagePattern":"CardinalityAggregator does not support getFloat\\(\\)","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityAggregator.java","lineNumber":106,"sourceCode":"    if (byRow) {\n      hashRow(selectorPluses, collector);\n    } else {\n      hashValues(selectorPluses, collector);\n    }\n  }\n\n  @Override\n  public synchronized Object get()\n  {\n    // Must make a new collector duplicating the underlying buffer to ensure the object from \"get\" is usable\n    // in a thread-safe manner.\n    return HyperLogLogCollector.makeCollectorSharingStorage(collector);\n  }\n\n  @Override\n  public float getFloat()\n  {\n    throw new UnsupportedOperationException(\"CardinalityAggregator does not support getFloat()\");\n  }\n\n  @Override\n  public long getLong()\n  {\n    throw new UnsupportedOperationException(\"CardinalityAggregator does not support getLong()\");\n  }\n\n  @Override\n  public double getDouble()\n  {\n    throw new UnsupportedOperationException(\"CardinalityAggregator does not support getDouble()\");\n  }\n\n  @Override\n  public void close()\n  {\n    // no resources to cleanup","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityAggregator.java#L88-L124","documentation":"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.","triggerScenarios":"Calling aggregator.getFloat() on a CardinalityAggregator instance created by CardinalityAggregatorFactory, e.g. when the query layer resolves the aggregation's type as FLOAT.","commonSituations":"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.","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"],"exampleFix":"// before\nfloat v = aggregator.getFloat();\n// after\nObject v = aggregator.get(); // HyperLogLogCollector / estimate","handlingStrategy":"type-guard","validationCode":"if (!(aggFactory instanceof CardinalityAggregatorFactory)) { float v = aggregator.getFloat(); }","typeGuard":"if (aggregator instanceof CardinalityAggregator) {\n    Object v = aggregator.get(); // HLL sketch/estimate\n} else {\n    float v = aggregator.getFloat();\n}","tryCatchPattern":"try {\n    v = aggregator.getFloat();\n} catch (UnsupportedOperationException e) {\n    v = Float.NaN; // fall back to get() + estimate extraction\n}","preventionTips":["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"],"tags":["java","druid","aggregation","cardinality","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}