{"record":{"id":"4ad8e245778bcd74","repo":"apache/druid","slug":"no-serde-for-complextypename-s-cannot-write-col","errorCode":null,"errorMessage":"No serde for complexTypeName[%s], cannot write column [%s]","messagePattern":"No serde for complexTypeName\\[(.+?)\\], cannot write column \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/frame/field/FieldWriters.java","lineNumber":202,"sourceCode":"  {\n    final ColumnValueSelector<?> selector =\n        TypeCastSelectors.makeColumnValueSelector(selectorFactory, columnName, ColumnType.DOUBLE_ARRAY);\n    return NumericArrayFieldWriter.getDoubleArrayFieldWriter(selector, frameType);\n  }\n\n  private static FieldWriter makeComplexWriter(\n      final ColumnSelectorFactory selectorFactory,\n      final String columnName,\n      @Nullable final String columnTypeName\n  )\n  {\n    if (columnTypeName == null) {\n      throw new ISE(\"No complexTypeName, cannot write column [%s]\", columnName);\n    }\n\n    final ComplexMetricSerde serde = ComplexMetrics.getSerdeForType(columnTypeName);\n    if (serde == null) {\n      throw new ISE(\"No serde for complexTypeName[%s], cannot write column [%s]\", columnTypeName, columnName);\n    }\n\n    final ColumnValueSelector<?> selector =\n        TypeCastSelectors.makeColumnValueSelector(selectorFactory, columnName, ColumnType.ofComplex(columnTypeName));\n    return new ComplexFieldWriter(serde, selector);\n  }\n}\n","sourceCodeStart":184,"sourceCodeEnd":210,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/frame/field/FieldWriters.java#L184-L210","documentation":"After obtaining the complex type name, makeComplexWriter resolves it to a ComplexMetricSerde via ComplexMetrics.getSerdeForType. If no serde is registered for that name, serialization is impossible and an ISE is thrown. Complex serdes must be registered in ComplexMetrics before any column of that type is read or written.","triggerScenarios":"Frame-writing a COMPLEX column whose complexTypeName (e.g. a custom aggregator type or one from an unloaded extension) is not registered in ComplexMetrics, so ComplexMetrics.getSerdeForType returns null.","commonSituations":"Querying/compacting segments written by an extension (e.g. datasketches) that is not loaded on this Druid node; typo'd complex type name in ingestion config; custom ComplexMetricSerde not registered on the query runner.","solutions":["Load the Druid extension that provides the complex metric type (e.g. druid-datasketches) on the affected service.","Verify the complexTypeName spelling matches the registered serde name.","Register the custom ComplexMetricSerde in ComplexMetrics before frame writing.","Drop/re-ingest segments referencing unknown complex types."],"exampleFix":"// before\ndruid.extensions.loadList=[\"druid-s3-extensions\"] // datasketches ext missing -> No serde for complexTypeName[quantilesDoublesSketch]\n\n// after\ndruid.extensions.loadList=[\"druid-s3-extensions\", \"druid-datasketches\"]","handlingStrategy":"validation","validationCode":"// Java: verify serde is registered before writing\nif (ComplexMetrics.getSerdeForType(complexTypeName) == null) {\n  throw new IllegalStateException(\"Serde not registered for \" + complexTypeName + \" - load the extension\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  FieldWriters.create(...);\n} catch (IllegalStateException e) {\n  if (e.getMessage().startsWith(\"No serde for complexTypeName\")) {\n    throw new IllegalStateException(\"Load the extension providing \" + complexTypeName, e);\n  }\n  throw e;\n}","preventionTips":["Load the same extensions on every node (druid.extensions.loadList) so serdes are always registered.","Confirm complex type names in ingestion specs match registered serde names."],"tags":["complex-column","serde","extension","druid"],"backgroundTag":"resource-not-found","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"}