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

  1. Upgrade Druid so the merger supports the metric's ValueType
  2. Change the aggregator to one that produces a supported ValueType (LONG/FLOAT/DOUBLE/COMPLEX)
  3. 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

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


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/c3d9c2897629e3dd. Report an issue: GitHub.