apache/druid · error · IllegalStateException
Unknown type[%s]
Error message
Unknown type[%s]
What it means
Thrown by makeMetricsColumns in IndexMergerBase when the metric column's ValueType is not one of the handled cases (LONG/FLOAT/DOUBLE/COMPLEX etc.), i.e. an unrecognized value type during metric column serialization. The switch statement builds a per-type column writer; any type outside that set hits the default branch.
Source
Thrown at processing/src/main/java/org/apache/druid/segment/IndexMergerBase.java:745
builder.addSerde(createFloatColumnPartSerde(writer, indexSpec));
break;
case DOUBLE:
builder.setValueType(ValueType.DOUBLE);
builder.addSerde(createDoubleColumnPartSerde(writer, indexSpec));
break;
case COMPLEX:
final String typeName = type.getComplexTypeName();
builder.setValueType(ValueType.COMPLEX);
builder.addSerde(
ComplexColumnPartSerde
.serializerBuilder()
.withTypeName(typeName)
.withDelegate(writer)
.build()
);
break;
default:
throw new ISE("Unknown type[%s]", type);
}
final String columnName = namePrefix + metric;
makeColumn(segmentFileBuilder, columnName, builder.build());
log.debug("Completed metric column[%s] in %,d millis.", columnName, System.currentTimeMillis() - metricStartTime);
}
log.debug("Completed metric columns in %,d millis.", System.currentTimeMillis() - startTime);
progress.stopSection(section);
}
/**
* Returns rowNumConversions, if fillRowNumConversions argument is true
*/
protected IndexMergeResult mergeIndexesAndWriteColumns(
final List<IndexableAdapter> adapters,
final ProgressIndicator progress,
final TimeAndDimsIterator timeAndDimsIterator,
final GenericColumnSerializer timeWriter,
final ArrayList<GenericColumnSerializer> metricWriters,View on GitHub (pinned to 9b90983fd2)
Solutions
- Upgrade Druid so the merger supports the metric's ValueType
- Change the aggregator to one that produces a supported ValueType (LONG/FLOAT/DOUBLE/COMPLEX)
- Ensure the extension providing the custom type is loaded on all nodes performing the merge
Example fix
// before
new JavascriptAggregatorFactory(...); // produces unsupported ValueType in merger
// after
new DoubleSumAggregatorFactory("metric", "value"); // supported ValueType Defensive patterns
Strategy: type-guard
Validate before calling
if (!EnumSet.of(ValueType.LONG, ValueType.FLOAT, ValueType.DOUBLE, ValueType.COMPLEX).contains(metricType)) { throw ...; } Type guard
boolean isWritableMetricType(ValueType t) { return t == LONG || t == FLOAT || t == DOUBLE || t == COMPLEX; } Try / catch
try { merger.merge(...); } catch (IllegalStateException e) { if (e.getMessage().startsWith("Unknown type")) { /* switch aggregator to supported ValueType */ } else throw e; } Prevention
- Only use aggregators producing numeric or complex metric types
- Keep all nodes on the same Druid version
- Verify ValueType support of custom aggregators before use
When it happens
Trigger: Merging/writing a segment whose metric aggregator produces a ValueType not covered by the writer switch (e.g. a newly added or custom ValueType, or STRING metrics where numeric is expected).
Common situations: Using an extension aggregator that returns an unusual ValueType; version skew where a newer segment format introduces a type the current merger does not handle; misconfigured rollup aggregators.
Related errors
- interval %s, bucketId %s mismatched shard specs: %s and %s
- Metric mismatch, index[%d] [%s] != [%s]
- Filling row num conversions is supported only with RowCombin
- Emit called unexpectedly before service start
- unknown event type [%s]
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/c3d9c2897629e3dd.
Report an issue: GitHub.