{"record":{"id":"2afec2b59b1293b4","repo":"apache/druid","slug":"cardinalityaggregator-does-not-support-getlong","errorCode":null,"errorMessage":"CardinalityAggregator does not support getLong()","messagePattern":"CardinalityAggregator does not support getLong\\(\\)","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityAggregator.java","lineNumber":112,"sourceCode":"\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\n  }\n}\n","sourceCodeStart":94,"sourceCodeEnd":127,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityAggregator.java#L94-L127","documentation":"CardinalityAggregator computes approximate distinct counts as a HyperLogLog sketch; it exposes get() (the sketch object) but its getLong() always throws UnsupportedOperationException. This fires when the query framework attempts numeric finalization of a cardinality aggregate — e.g. coercing a COUNT(DISTINCT x) result to BIGINT inside the aggregator instead of post-finalization.","triggerScenarios":"Calling aggregator.getLong() on a CardinalityAggregator when the caller assumes a long-typed aggregation result.","commonSituations":"Numeric extraction of cardinality results in custom code or rollup numeric columns; using cardinality where a long aggregator was expected.","solutions":["Let the sketch be finalized via get() and convert to a count afterwards (the normal post-aggregation path); don't read it as a long in-flight.","Use APPROX_COUNT_DISTINCT_DS or numeric-typed distinct approximations that support direct values if a number is required.","Check for custom post-aggregators that call getLong() on the raw cardinality aggregate."],"exampleFix":"// before\nlong v = aggregator.getLong();\n// after\nObject v = aggregator.get(); // HyperLogLogCollector / estimate","handlingStrategy":"validation","validationCode":"if (!(aggFactory instanceof CardinalityAggregatorFactory)) { long v = aggregator.getLong(); }","typeGuard":"if (aggregator instanceof CardinalityAggregator) {\n    Object v = aggregator.get();\n} else {\n    long v = aggregator.getLong();\n}","tryCatchPattern":"try {\n    v = aggregator.getLong();\n} catch (UnsupportedOperationException e) {\n    v = 0L; // or extract estimate from get()\n}","preventionTips":["Use long aggregators (e.g. longSum/distinctCount variants) for long output","Check AggregatorFactory.getType() == \"string\"/\"object\" before getLong()","Finalize HLL sketches before treating results numerically"],"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"}