apache/seatunnel · error · HudiConnectorException

UNSUPPORTED_OPERATION

UNSUPPORTED_OPERATION

Error message

Unsupported operation type: ${opType}

What it means

executeWrite() dispatches to the Hudi write client based on the configured operation type (upsert, bulk_insert); any other configured opType hits default and throws HudiConnectorException with UNSUPPORTED_OPERATION because the connector does not implement that operation.

Source

Thrown at seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/writer/HudiRecordWriter.java:182

        buffer.clear();
    }

    private void executeWrite() {
        HoodieJavaWriteClient<HoodieAvroPayload> writeClient = clientProvider.getOrCreateClient();
        String writeInstantTime = writeClient.startCommit();
        // write records
        switch (hudiTableConfig.getOpType()) {
            case INSERT:
                writeClient.insert(writeRecords, writeInstantTime);
                break;
            case UPSERT:
                writeClient.upsert(writeRecords, writeInstantTime);
                break;
            case BULK_INSERT:
                writeClient.bulkInsert(writeRecords, writeInstantTime);
                break;
            default:
                throw new HudiConnectorException(
                        HudiErrorCode.UNSUPPORTED_OPERATION,
                        "Unsupported operation type: " + hudiTableConfig.getOpType());
        }
        writeRecords.clear();
    }

    private void executeDelete() {
        HoodieJavaWriteClient<HoodieAvroPayload> writeClient = clientProvider.getOrCreateClient();
        writeClient.delete(deleteRecordKeys, writeClient.startCommit());
        deleteRecordKeys.clear();
    }

    protected void prepareRecords(SeaTunnelRow element) {
        HoodieRecord<HoodieAvroPayload> hoodieAvroPayloadHoodieRecord =
                recordConverter.convertRow(schema, seaTunnelRowType, element, hudiTableConfig);
        HoodieKey recordKey = hoodieAvroPayloadHoodieRecord.getKey();
        boolean changeFlag = changeFlag(element.getRowKind());
        buffer.put(recordKey, Pair.of(changeFlag, hoodieAvroPayloadHoodieRecord));

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Set the op_type config to one of the supported values (upsert or bulk_insert)
  2. Correct typos/case in the op_type value in the job config
  3. Check the connector docs for the list of supported operation types

Example fix

// before
"op_type" = "insert_overwrite"
// after
"op_type" = "upsert"
Defensive patterns

Strategy: validation

Validate before calling

String op = config.get("op_type");
if (!"upsert".equalsIgnoreCase(op) && !"bulk_insert".equalsIgnoreCase(op)) {
    throw new IllegalArgumentException("op_type must be upsert or bulk_insert, got: " + op);
}

Try / catch

try {
    sink.writeRecord(row);
} catch (HudiConnectorException e) {
    if (HudiErrorCode.UNSUPPORTED_OPERATION.equals(e.getPluginErrorCode())) {
        LOG.error("Fix op_type config; supported: upsert, bulk_insert");
    } else { throw e; }
}

Prevention

When it happens

Trigger: hudiTableConfig.getOpType() returns a value other than UPSERT or BULK_INSERT (e.g. INSERT, DELETE, INSERT_OVERWRITE) when flush() triggers executeWrite.

Common situations: Typo or unsupported value in the op_type config option; copying a config from another connector; newer Hudi op types not mapped by this connector version.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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