apache/seatunnel · warning
Column {} already exists in table {}. Skipping add column op
Error message
Column {} already exists in table {}. Skipping add column operation. event: {} What it means
This WARN log is emitted by SchemaChangeManager.applySchemaChange when an AlterTableAddColumnEvent arrives for a column that already exists in the target Doris table. The add operation is skipped (early return) so that idempotent replays of schema-change events do not fail the pipeline. The library treats an existing identically-named column as 'add already done'.
Source
Thrown at seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/schema/SchemaChangeManager.java:119
.getOldColumn()
.equals(changeColumnEvent.getColumn().getName())) {
if (!columnExists(tablePath, changeColumnEvent.getOldColumn())
&& columnExists(tablePath, changeColumnEvent.getColumn().getName())) {
log.warn(
"Column {} already exists in table {}. Skipping change column operation. event: {}",
changeColumnEvent.getColumn().getName(),
tablePath.getFullName(),
event);
return;
}
}
applySchemaChange(tablePath, changeColumnEvent);
} else if (event instanceof AlterTableModifyColumnEvent) {
applySchemaChange(tablePath, (AlterTableModifyColumnEvent) event);
} else if (event instanceof AlterTableAddColumnEvent) {
AlterTableAddColumnEvent addColumnEvent = (AlterTableAddColumnEvent) event;
if (columnExists(tablePath, addColumnEvent.getColumn().getName())) {
log.warn(
"Column {} already exists in table {}. Skipping add column operation. event: {}",
addColumnEvent.getColumn().getName(),
tablePath.getFullName(),
event);
return;
}
applySchemaChange(tablePath, addColumnEvent);
} else if (event instanceof AlterTableDropColumnEvent) {
AlterTableDropColumnEvent dropColumnEvent = (AlterTableDropColumnEvent) event;
if (!columnExists(tablePath, dropColumnEvent.getColumn())) {
log.warn(
"Column {} does not exist in table {}. Skipping drop column operation. event: {}",
dropColumnEvent.getColumn(),
tablePath.getFullName(),
event);
return;
}
applySchemaChange(tablePath, dropColumnEvent);View on GitHub (pinned to cf67b549a7)
Solutions
- Confirm via DESC tbl / SHOW CREATE TABLE that the column exists with the correct type; if it matches, the warning is benign and can be ignored.
- If the existing column has the WRONG type, drop it (ALTER TABLE ... DROP COLUMN) and restart the job so the add event runs with the correct definition.
- Ensure a single pipeline owns schema changes for this table; disable schema_evolution or point the duplicate pipeline at a different table.
- Restart from the latest checkpoint/savepoint so schema events are not replayed from an old offset.
Example fix
// before: replayed ADD COLUMN against a table that already has the column ALTER TABLE db.tbl ADD COLUMN extra_col INT; // after: guard/pre-clean // ALTER TABLE db.tbl DROP COLUMN extra_col; -- if type differs // or restart from latest checkpoint so the event is not duplicated
Defensive patterns
Strategy: validation
Validate before calling
// Pre-check the Doris table before enabling schema evolution DESC db.tbl; -- confirm which columns already exist // Skip or pre-drop conflicting columns before (re)starting the job
Type guard
boolean addAlreadyApplied(DorisTableSchema schema, String column) {
return schema.hasColumn(column); // if true, expect the skip warning
} Prevention
- Restart from the latest checkpoint to avoid duplicate add events.
- Use a dedicated schema-evolution owner per table; disable schema_evolution on duplicate pipelines.
- Compare the intended column type with DESC output — an existing same-name column with a different type still needs manual correction.
- Avoid pre-adding columns manually when schema_evolution=true.
When it happens
Trigger: columnExists(tablePath, addColumnEvent.getColumn().getName()) returns true when the add event is processed — e.g. the same add event is replayed after checkpoint restore, the schema lock/coordination allowed another writer to add it first, or the user manually added the column to Doris before running the job.
Common situations: Restarting a Flink/Spark CDC job from an older savepoint so pending schema events re-execute; a DBA pre-added the column; running two pipelines from the same source database into one Doris table; Doris light-schema-change already applied the column in a prior attempt.
Related errors
- Column {} already exists in table {}. Skipping change column
- Column {} does not exist in table {}. Skipping drop column o
- Unsupported schemaChangeEvent : <eventType>
- SCHEMA_CHANGE_FAILED
- SCHEMA_CHANGE_FAILED
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/07fd69224f5d2fcf.
Report an issue: GitHub.