apache/seatunnel · error · DeepLakeConnectorException

UNSUPPORTED_ROW_KIND

UNSUPPORTED_ROW_KIND

Error message

DeepLake sink supports append-only input, but received ${element.getRowKind()}

What it means

DeepLakeSinkWriter.write only accepts RowKind.INSERT rows; UPDATE_BEFORE/UPDATE_AFTER/DELETE rows are rejected with DeepLakeConnectorException(UNSUPPORTED_ROW_KIND). The Deep Lake sink is append-only, so changelog streams must be reduced to inserts before writing.

Source

Thrown at seatunnel-connectors-v2/connector-deeplake/src/main/java/org/apache/seatunnel/connectors/seatunnel/deeplake/sink/DeepLakeSinkWriter.java:82

                                + DeepLakeSql.qualifiedTable(
                                        config.getWorkspace(), config.getTable())
                                + " LIMIT 0");
            }
        } catch (RuntimeException | Error e) {
            try {
                client.close();
            } catch (IOException closeError) {
                e.addSuppressed(closeError);
            }
            throw e;
        }
    }

    @Override
    public void write(SeaTunnelRow element) {
        ensureActive();
        if (element.getRowKind() != RowKind.INSERT) {
            throw new DeepLakeConnectorException(
                    DeepLakeConnectorErrorCode.UNSUPPORTED_ROW_KIND,
                    "DeepLake sink supports append-only input, but received "
                            + element.getRowKind());
        }
        try {
            rows.add(DeepLakeRowConverter.convert(element, rowType));
            if (rows.size() >= batchSize) {
                flush();
            }
        } catch (RuntimeException | Error e) {
            failed = true;
            throw e;
        }
    }

    @Override
    public Optional<Void> prepareCommit() {
        ensureActive();

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Insert a deduplication/aggregation transform upstream so only INSERT rows reach the sink
  2. Flatten CDC u_u/d_u events into insert-only form (materialize current state)
  3. Use a sink supporting changelog semantics if append-only processing is not acceptable

Example fix

// before
source(MySQL-CDC) -> sink(DeepLake)
// after
source(MySQL-CDC) -> transform(Deduplicate, keys=[id]) -> sink(DeepLake)
Defensive patterns

Strategy: validation

Validate before calling

if (row.getRowKind() != RowKind.INSERT) { throw new IllegalStateException("DeepLake sink requires INSERT rows, got " + row.getRowKind()); }

Type guard

boolean isInsertOnly(SeaTunnelRow row) { return row.getRowKind() == RowKind.INSERT; }

Try / catch

try { writer.write(row); } catch (DeepLakeConnectorException e) { if ("UNSUPPORTED_ROW_KIND".equals(e.getErrorCode())) log.error("Non-insert row rejected: {}", e.getMessage()); throw e; }

Prevention

When it happens

Trigger: Writing SeaTunnelRows whose RowKind is not INSERT — typically CDC data (MySQL CDC/debezium) flowing directly into the sink, or a transform emitting update/delete events.

Common situations: CDC-to-Deep Lake pipelines without a deduplication/aggregation step; streaming jobs emitting retract messages; upstream transforms leaving change kinds intact.

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/53d69df791b2aeb9. Report an issue: GitHub.