apache/seatunnel · error · SeaTunnelException
Table %s field %s duplicate
Error message
Table %s field %s duplicate
What it means
Thrown by TableFactoryContext.checkCatalogTableIllegal when the same field name appears more than once in a CatalogTable's schema. Duplicate column names are ambiguous for row-type resolution and downstream column mapping, so the factory context rejects the table before plugin creation.
Source
Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/table/factory/TableFactoryContext.java:53
private final ClassLoader classLoader;
public TableFactoryContext(ReadonlyConfig options, ClassLoader classLoader) {
this.options = options;
this.classLoader = classLoader;
}
protected static void checkCatalogTableIllegal(List<CatalogTable> catalogTables) {
for (CatalogTable catalogTable : catalogTables) {
List<String> alreadyChecked = new ArrayList<>();
for (String fieldName : catalogTable.getTableSchema().getFieldNames()) {
if (StringUtils.isBlank(fieldName)) {
throw new SeaTunnelException(
String.format(
"Table %s field name cannot be empty",
catalogTable.getTablePath().getFullName()));
}
if (alreadyChecked.contains(fieldName)) {
throw new SeaTunnelException(
String.format(
"Table %s field %s duplicate",
catalogTable.getTablePath().getFullName(), fieldName));
}
alreadyChecked.add(fieldName);
}
}
}
}
View on GitHub (pinned to cf67b549a7)
Solutions
- Remove or rename the duplicate field in the schema so all names are unique.
- Use a Transform (e.g. Replace/SQL) to rename one of the colliding upstream columns before the sink.
- If building CatalogTable in code, de-duplicate field names when constructing TableSchema.
- Check which connector/catalog produced the duplicated column and fix its column derivation.
Example fix
// before
schema { fields { name = string, name = int, id = long } }
// after
schema { fields { name = string, age = int, id = long } } Defensive patterns
Strategy: validation
Validate before calling
Set<String> seen = new HashSet<>(); for (String n : table.getTableSchema().getFieldNames()) { if (!seen.add(n)) throw new IllegalArgumentException("duplicate field: " + n); } Type guard
boolean hasDuplicate = Arrays.stream(schema.getFieldNames()).distinct().count() != (schema.getFieldNames() == null ? 0 : schema.getFieldNames().length);
Try / catch
try { factory.createAndPrepareSource(...) } catch (SeaTunnelException e) { if (e.getMessage().contains("duplicate")) { log.error("duplicate schema field: {}", e.getMessage()); } throw e; } Prevention
- De-duplicate columns when merging schemas
- Rename colliding CDC columns with a Transform upstream
- Add uniqueness assertions in catalog tests
When it happens
Trigger: Calling TableFactoryContext (via createAndPrepareSource/Sink/Transform) with a CatalogTable whose TableSchema.getFieldNames() contains a repeated name — e.g. a schema block declaring 'name' twice, or a catalog merging multiple upstream column definitions under the same key.
Common situations: Copy-paste errors in hand-written schema blocks; CDC pipelines where a renamed column collides with an existing one; connector catalog code that appends columns without de-duplicating; multi-table configs where a shared schema fragment is merged twice.
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
- Table %s field name cannot be empty
- Operator %s requires a compareOption (cross-field comparison
- Schema config can not be empty
- Streaming mode requires a Primary Key in the schema of table
- FIELD_NOT_IN_TABLE
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/68e9a67793748bae.
Report an issue: GitHub.