apache/druid · error · UnsupportedOperationException
Cannot operate on a dimension with unknown cardinality
Error message
Cannot operate on a dimension with unknown cardinality
What it means
The string-dimension TopN aggregates processor (used by the heap-based TopN algorithm) needs a known dimension cardinality to allocate aggregator arrays. When the segment's dimension cardinality is unknown (negative, e.g. because an extraction function is applied to the dimension), the processor throws UnsupportedOperationException in getRowSelector.
Source
Thrown at processing/src/main/java/org/apache/druid/query/topn/types/StringTopNColumnAggregatesProcessor.java:67
this.capabilities = capabilities;
this.dimensionValueConverter = DimensionHandlerUtils.converterFromTypeToType(ColumnType.STRING, dimensionType);
}
@Override
public int getCardinality(DimensionSelector selector)
{
// only report the underlying selector cardinality if the column the selector is for is dictionary encoded
if (capabilities.isDictionaryEncoded().isTrue()) {
return selector.getValueCardinality();
}
return DimensionDictionarySelector.CARDINALITY_UNKNOWN;
}
@Override
public Aggregator[][] getRowSelector(TopNQuery query, TopNParams params, TopNCursorInspector cursorInspector)
{
if (params.getCardinality() < 0) {
throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality");
}
// This method is used for the HeapBasedTopNAlgorithm only.
// Unlike regular topN we cannot rely on ordering to optimize.
// Optimization possibly requires a reverse lookup from value to ID, which is
// not possible when applying an extraction function
final BaseTopNAlgorithm.AggregatorArrayProvider provider = new BaseTopNAlgorithm.AggregatorArrayProvider(
(DimensionSelector) params.getSelectorPlus().getSelector(),
query,
cursorInspector,
params.getCardinality()
);
return provider.build();
}
@Override
public void updateResults(TopNResultBuilder resultBuilder)View on GitHub (pinned to 9b90983fd2)
Solutions
- Remove the extraction function from the topN dimension (apply transformation after the query or via a virtual column/transform)
- Increase minTopNThreshold context so a non-heap-based algorithm can be used, or restructure the query to avoid the heap-based path
- Prefer groupBy over topN when dimension extraction makes cardinality unknown
- Update the segment / ensure column cardinality is available (force rollup/republish if needed)
Example fix
// before
DimensionSpec dim = new ExtractionDimensionSpec("col", "out", ColumnType.STRING,
new CascadeExtractionFn(new ExtractionFn[] { new TimeFormatExtractionFn(...) }));
TopNQuery q = new TopNQueryBuilder().dimension(dim).threshold(5000).build(); // heap-based path, unknown cardinality
// after
TopNQuery q = new TopNQueryBuilder().dimension(new DefaultDimensionSpec("col", "out", ColumnType.STRING))
.threshold(1000).build(); // known cardinality, ordering-optimized path Defensive patterns
Strategy: validation
Validate before calling
DimensionSelector selector = params.getDimensionSelector();
if (selector.getValueCardinality() < 0) {
throw new IllegalArgumentException("topN dimension has unknown cardinality; remove extractionFn or use groupBy");
} Type guard
static boolean hasKnownCardinality(DimensionSelector selector) {
return selector != null && selector.getValueCardinality() >= 0;
} Try / catch
try {
Sequence<Result<TopNResultValue>> results = runner.run(queryPlus, ctx).toList();
} catch (UnsupportedOperationException e) {
if (e.getMessage().contains("unknown cardinality")) {
// fall back to a groupBy query or drop the extraction function
} else {
throw e;
}
} Prevention
- Avoid extraction functions on topN dimensions; use transforms/virtual columns instead
- Prefer groupBy for queries needing dimension transformation
- Know that heap-based topN (large thresholds) requires known column cardinality
- Test topN queries with dimension extraction on realtime segments before deploying
When it happens
Trigger: Running a topN query with a HeapBasedTopNAlgorithm against a dimension whose cardinality is unknown (< 0). This typically occurs when the dimension has an extraction function applied, or the column supplies unknown cardinality (e.g. certain dimension selectors during historical/realtime segment queries).
Common situations: TopN queries with dimensionExtractionFn on a column whose underlying cardinality cannot be computed; queries hitting realtime segments where cardinality is not yet fixed; tuning minTopNThreshold such that the heap-based algorithm is chosen for such queries.
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
- Only DimensionSelectors which support idLookup() are support
- Not implemented
- Not implemented
- Not implemented
- Not implemented
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/a9923737a5ac4679.
Report an issue: GitHub.