{"record":{"id":"37b55e40ca43a19a","repo":"apache/druid","slug":"no-serde-for-complextypename-s","errorCode":null,"errorMessage":"No serde for complexTypeName[%s]","messagePattern":"No serde for complexTypeName\\[(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/frame/field/ComplexFieldReader.java","lineNumber":72,"sourceCode":"public class ComplexFieldReader implements FieldReader\n{\n  private final ComplexMetricSerde serde;\n\n  ComplexFieldReader(final ComplexMetricSerde serde)\n  {\n    this.serde = Preconditions.checkNotNull(serde, \"serde\");\n  }\n\n  public static ComplexFieldReader createFromType(final ColumnType columnType)\n  {\n    if (columnType == null || columnType.getType() != ValueType.COMPLEX || columnType.getComplexTypeName() == null) {\n      throw new ISE(\"Expected complex type with defined complexTypeName, but got [%s]\", columnType);\n    }\n\n    final ComplexMetricSerde serde = ComplexMetrics.getSerdeForType(columnType.getComplexTypeName());\n\n    if (serde == null) {\n      throw new ISE(\"No serde for complexTypeName[%s]\", columnType.getComplexTypeName());\n    }\n\n    return new ComplexFieldReader(serde);\n  }\n\n  @Override\n  public ColumnValueSelector<?> makeColumnValueSelector(Memory memory, ReadableFieldPointer fieldPointer)\n  {\n    return new Selector<>(memory, fieldPointer, serde);\n  }\n\n  @Override\n  public DimensionSelector makeDimensionSelector(\n      Memory memory,\n      ReadableFieldPointer fieldPointer,\n      @Nullable ExtractionFn extractionFn\n  )\n  {","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/frame/field/ComplexFieldReader.java#L54-L90","documentation":"After confirming the column type is COMPLEX with a name, ComplexFieldReader.createFromType resolves the ComplexMetricSerde via ComplexMetrics.getSerdeForType(complexTypeName). It throws ISE when no serde is registered for that name, meaning the runtime cannot deserialize this complex column's values.","triggerScenarios":"Reading a frame/segment whose complexTypeName (e.g. an aggregator-specific type like 'hyperUnique' or a custom sketch type) is not registered in ComplexMetrics — typically because the Druid extension providing the serde is not loaded.","commonSituations":"Querying segments written with an extension-enabled cluster from a node missing that extension; typos in complexTypeName; custom aggregators registered only on some services; version changes where a serde was renamed.","solutions":["Load the Druid extension that registers the missing serde (add it to the loadList in druid extensions config).","Verify ComplexMetrics.getSerdeForType(name) returns non-null for the reported type name in your runtime.","Check for typos or renames of the complex type name between write and read versions.","Ensure all data/coordinator/router nodes have the same extensions so any node can read the column."],"exampleFix":"// before\n// extensions=[] in runtime.properties, column complexTypeName=quantilesDoublesSketch\n// after\n// runtime.properties\ndruid.extensions.loadList=[\"druid-datasketches\"]","handlingStrategy":"validation","validationCode":"if (ComplexMetrics.getSerdeForType(columnType.getComplexTypeName()) == null) { throw new IllegalStateException(\"extension providing serde for \" + columnType.getComplexTypeName() + \" not loaded\"); }","typeGuard":null,"tryCatchPattern":"try { reader = ComplexFieldReader.createFromType(t); } catch (IllegalStateException e) { log.error(\"missing serde: load the extension for {}\", t.getComplexTypeName()); throw e; }","preventionTips":["Keep druid.extensions.loadList identical across all nodes","Verify serde registration at startup with a self-check","Document required extensions for all ingested complex types"],"tags":["complex-types","serde","extensions"],"backgroundTag":"missing-dependency","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"}