apache/seatunnel · error · SeaTunnelRuntimeException

CONFIG_VALIDATION_FAILED

CONFIG_VALIDATION_FAILED

Error message

table_options contains a blank property key for Paimon sink.

What it means

PaimonTableOptionsValidator.validate checks the sink's table_options map for malformed entries. A blank (null/whitespace) property key causes a SeaTunnelRuntimeException with SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED and this message; a null value is likewise rejected.

Source

Thrown at seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonTableOptionsValidator.java:46

import java.util.Map;

/**
 * Validates Paimon sink {@code table_options} before job submission.
 *
 * <p>Paimon accepts open CoreOptions keys; this validator only rejects blank keys or null values.
 * Unsupported option keys fail later when Paimon creates the table.
 */
public final class PaimonTableOptionsValidator {

    private PaimonTableOptionsValidator() {}

    public static void validate(ReadonlyConfig config, Map<String, String> tableOptions) {
        if (tableOptions == null || tableOptions.isEmpty()) {
            return;
        }
        for (Map.Entry<String, String> entry : tableOptions.entrySet()) {
            if (StringUtils.isBlank(entry.getKey())) {
                throw new SeaTunnelRuntimeException(
                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                        "table_options contains a blank property key for Paimon sink.");
            }
            if (entry.getValue() == null) {
                throw new SeaTunnelRuntimeException(
                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                        String.format(
                                "table_options property '%s' has null value for Paimon sink.",
                                entry.getKey()));
            }
        }
    }

    public static void validate(ReadonlyConfig config) {
        validate(
                config,
                config.getOptional(SinkConnectorCommonOptions.TABLE_OPTIONS)
                        .orElse(Collections.emptyMap()));

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Remove or fix the blank-key entry in table_options in the job config
  2. Check for template variables that expand to empty strings and become keys
  3. Lint the HOCON/YAML config so keys are never empty

Example fix

// before
table_options {
  "" = "some-value"
}
// after
table_options {
  "bucket" = "2"
}
Defensive patterns

Strategy: validation

Validate before calling

if (tableOptions != null) { for (String k : tableOptions.keySet()) { if (k == null || k.isBlank()) { throw new IllegalArgumentException("table_options contains a blank key"); } } }

Try / catch

try { PaimonTableOptionsValidator.validate(config, tableOptions); } catch (SeaTunnelRuntimeException e) { if (SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED.equals(e.getErrorCode())) { /* sanitize table_options and retry */ } else { throw e; } }

Prevention

When it happens

Trigger: Calling validate(config, tableOptions) with a non-empty table_options map containing an entry whose key is blank — typically produced by malformed HOCON/YAML such as `"" : "value"` or a key consisting only of spaces.

Common situations: Hand-edited config with an empty key line; template/config generator emitting an empty key when a variable is unset; YAML indentation mistakes turning a key into an empty string.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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