apache/seatunnel · error · FileConnectorException

FORMAT_NOT_SUPPORT

FORMAT_NOT_SUPPORT

Error message

schema_evolution_enabled=true is not supported for file_format_type=binary. Binary format has a fixed schema and cannot apply schema changes.

What it means

Binary file format stores raw bytes with a fixed internal schema, so schema evolution (schema_evolution_enabled=true) cannot be applied to it. FileSinkConfig rejects this combination with FileConnectorException FORMAT_NOT_SUPPORT at sink construction time, since evolved columns could never be represented in a binary payload.

Solutions

  1. Set schema_evolution_enabled = false for binary sinks.
  2. Switch file_format_type to a schema-capable format (parquet, orc, text, json) if evolution is required.
  3. Route binary data to a separate sink from schema-evolving structured data.

Example fix

// before
file_format_type = "binary"
schema_evolution_enabled = true
// after
file_format_type = "binary"
schema_evolution_enabled = false
Defensive patterns

Strategy: validation

Validate before calling

if (config.schemaEvolutionEnabled && "binary".equals(config.fileFormatType)) {
  throw new IllegalArgumentException("schema_evolution_enabled is unsupported for binary format");
}

Prevention

When it happens

Trigger: Configuring a file sink with file_format_type = "binary" together with schema_evolution_enabled = true.

Common situations: Users enabling schema evolution globally for CDC/merge-update pipelines whose target format is binary; copy-pasting schema-evolution configs across text/parquet/binary sinks.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/f8ef2fd2b3ea26dc. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/sink/config/FileSinkConfig.java:228

            this.parquetWriteTimestampAsInt96 =
                    pluginConfig.get(FileBaseSinkOptions.PARQUET_AVRO_WRITE_TIMESTAMP_AS_INT96);
            this.parquetAvroWriteFixedAsInt96 =
                    pluginConfig.get(FileBaseSinkOptions.PARQUET_AVRO_WRITE_FIXED_AS_INT96);
        }

        if (FileFormat.CSV.equals(this.fileFormat)) {
            this.csvStringQuoteMode = pluginConfig.get(FileBaseSinkOptions.CSV_STRING_QUOTE_MODE);
        }
        if (FileFormat.DEBEZIUM_JSON.equals(this.fileFormat)
                || FileFormat.CANAL_JSON.equals(this.fileFormat)
                || FileFormat.MAXWELL_JSON.equals(this.fileFormat)) {
            this.mergeUpdateEvent = pluginConfig.get(FileBaseSinkOptions.MERGE_UPDATE_EVENT);
        }

        this.schemaEvolutionEnabled =
                pluginConfig.get(FileBaseSinkOptions.SCHEMA_EVOLUTION_ENABLED);
        if (this.schemaEvolutionEnabled && FileFormat.BINARY.equals(this.fileFormat)) {
            throw new FileConnectorException(
                    FileConnectorErrorCode.FORMAT_NOT_SUPPORT,
                    "schema_evolution_enabled=true is not supported for file_format_type=binary."
                            + " Binary format has a fixed schema and cannot apply schema changes.");
        }
        // schema_evolution + partition_by is supported: AbstractWriteStrategy.applySchemaChange
        // rebuilds both sinkColumnsIndexInRow and partitionFieldsIndexInRow from column NAMES
        // against the post-ALTER row type. Dropping a partition column itself is rejected at
        // rebuild time (throws IllegalStateException) so the partition tree never corrupts.
    }
}

View on GitHub (pinned to cf67b549a7)