{"record":{"id":"3fc597f245b8b53c","repo":"apache/seatunnel","slug":"unsupported-to-derive-schema-for-type-datatype","errorCode":null,"errorMessage":"Unsupported to derive Schema for type: ${dataType}","messagePattern":"Unsupported to derive Schema for type: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/convert/AvroSchemaConverter.java","lineNumber":163,"sourceCode":"            case MAP:\n                Schema map =\n                        SchemaBuilder.builder()\n                                .map()\n                                .values(\n                                        convertToSchema(\n                                                extractValueTypeToAvroMap(dataType),\n                                                rowName,\n                                                true));\n                return nullableSchema(map);\n            case ARRAY:\n                ArrayType<?, ?> arrayType = (ArrayType<?, ?>) dataType;\n                Schema array =\n                        SchemaBuilder.builder()\n                                .array()\n                                .items(convertToSchema(arrayType.getElementType(), rowName, true));\n                return nullableSchema(array);\n            default:\n                throw new UnsupportedOperationException(\n                        \"Unsupported to derive Schema for type: \" + dataType);\n        }\n    }\n\n    public static SeaTunnelDataType<?> extractValueTypeToAvroMap(SeaTunnelDataType<?> type) {\n        SeaTunnelDataType<?> keyType;\n        SeaTunnelDataType<?> valueType;\n        MapType<?, ?> mapType = (MapType<?, ?>) type;\n        keyType = mapType.getKeyType();\n        valueType = mapType.getValueType();\n        if (keyType.getSqlType() != SqlType.STRING) {\n            throw new UnsupportedOperationException(\n                    \"Avro format doesn't support non-string as key type of map. \"\n                            + \"The key type is: \"\n                            + keyType.getSqlType());\n        }\n        return valueType;\n    }","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/convert/AvroSchemaConverter.java#L145-L181","documentation":"AvroSchemaConverter.convertToSchema() maps SeaTunnel data types to Avro schemas. The default branch throws UnsupportedOperationException when it encounters a SeaTunnel type with no Avro mapping implemented. Recursion through nested types (array/map/row) means a deeply nested unsupported type also triggers this.","triggerScenarios":"Writing a SeaTunnel row containing a field (possibly nested inside arrays, maps, or rows) whose SeaTunnelType (e.g. certain Time/Interval/bytes variants not handled in the switch) has no case in the converter when building the Hudi write schema.","commonSituations":"Upstream tables containing exotic column types (e.g. network addresses, arrays of unhandled types) being synced to Hudi; schema evolution introducing a new SeaTunnel type; version drift where the connector predates support for a SeaTunnel API type.","solutions":["Cast or transform the offending column to a supported type in an upstream transform (e.g. cast to STRING) before the Hudi sink.","Check the AvroSchemaConverter switch for supported SqlTypes and drop unsupported columns via a Filter transform.","Upgrade SeaTunnel/connector-hudi to a version that supports the offending type.","If support exists but should be added, extend the switch in AvroSchemaConverter with a SchemaBuilder mapping."],"exampleFix":"// before (unhandled type flows to sink)\nsource -> Hudi sink\n\n// after\nsource -> Sql{ transform = \"cast(unhandled_col as string)\" } -> Hudi sink","handlingStrategy":"validation","validationCode":"catalogTable.getTableSchema().toPhysicalRowDataType()\n    .getChildren()\n    .forEach(t -> checkSupported(t.getSqlType())); // reject types missing in AvroSchemaConverter switch","typeGuard":"static boolean isAvroConvertible(SeaTunnelDataType<?> t) {\n    switch (t.getSqlType()) {\n        case ROW: return ((SeaTunnelRowType) t).getFields().length > 0\n            && Arrays.stream(((SeaTunnelRowType) t).getFieldTypes())\n                .allMatch(AvroSchemaConverter::isAvroConvertible);\n        case MAP: return isAvroConvertible(((MapType<?, ?>) t).getValueType());\n        case ARRAY: return isAvroConvertible(((ArrayType<?, ?>) t).getElementType());\n        default: return Arrays.asList(SqlType.STRING, SqlType.BOOLEAN, SqlType.TINYINT,\n            SqlType.SMALLINT, SqlType.INT, SqlType.BIGINT, SqlType.FLOAT, SqlType.DOUBLE,\n            SqlType.DATE, SqlType.TIMESTAMP, SqlType.BYTES).contains(t.getSqlType());\n    }\n}","tryCatchPattern":"try {\n    Schema s = AvroSchemaConverter.convertToSchema(rowType, \"rowName\");\n} catch (UnsupportedOperationException e) {\n    // identify unsupported field, cast/drop it upstream, then retry conversion\n}","preventionTips":["Restrict synced columns to types supported by the converter.","Cast exotic types to STRING before the Hudi sink.","Re-run schema compatibility checks after upstream schema evolution."],"tags":["hudi","avro","schema","unsupported-type","type-mapping"],"backgroundTag":"unsupported-dtype","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}