apache/seatunnel · warning
No converter found for key
Error message
No converter found for key:{} What it means
StructConverter converts Arrow vector children to SeaTunnel types using a map of per-field converters (genericsConverters). When a child field's key has no registered converter, this warning is logged and the raw value is passed through unconverted. This is a graceful fallback, not an exception; the unconverted value may have an unexpected Java type downstream.
Solutions
- Check which key is reported and add/register a converter for that Arrow child type, or upgrade SeaTunnel to a version that supports it
- Inspect the Arrow schema upstream and cast unsupported columns to supported types (e.g. cast Decimal to Double) before they reach the source
- Verify the passthrough value type downstream is acceptable; if not, transform the data at the source system
Example fix
// before (registry missing Decimal converter)
genericsConverters = Map.of("int", intFn, "varchar", strFn);
// after
genericsConverters.put("decimal", decimalFn); // register converter for the missing key Defensive patterns
Strategy: fallback
Validate before calling
// Validate Arrow schema before reading
for (Field child : structVector.getField().getChildren()) {
if (!knownConverterKeys.contains(child.getName())) {
log.warn("Column {} will pass through unconverted", child.getName());
}
} Type guard
boolean hasConverter(String key) {
return genericsConverters.containsKey(key);
} Prevention
- Cast unsupported Arrow types upstream to primitives before writing
- Keep upstream Arrow schema and connector version compatible
- Downstream, assert/verify value types after conversion to catch passthrough values
When it happens
Trigger: An Arrow StructVector contains a child field whose name/key is not present in the genericsConverters map — i.e., an Arrow data type the converter factory did not build a converter for (e.g. unusual logical types like Decimal, Union, or Extension types).
Common situations: Reading Arrow data produced by upstream systems with richer types than the connector supports; new Arrow logical types not covered by the converter registry; nested/complex structs whose children were not registered.
Related errors
- COMMON-17
- Unsupported DuckDB type
- Unsupported SQL type
- ARRAY type requires element type
- Batch write failed ( element(s)); falling back to…
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/7771a094f74b6503.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/source/arrow/converter/StructConverter.java:53
public Object convert(int rowIndex, StructVector fieldVector) {
return fieldVector.isNull(rowIndex) ? null : fieldVector.getObject(rowIndex);
}
@Override
public Object convert(
int rowIndex, StructVector fieldVector, Map<String, Function> genericsConverters) {
Map<String, ?> valueMap = fieldVector.getObject(rowIndex);
return valueMap.entrySet().stream()
.collect(
Collectors.toMap(
Map.Entry::getKey,
e -> {
Optional<Function> optional =
Optional.ofNullable(genericsConverters.get(e.getKey()));
if (optional.isPresent()) {
return optional.get().apply(e.getValue());
} else {
log.warn("No converter found for key:{}", e.getKey());
return e.getValue();
}
}));
}
@Override
public boolean support(Types.MinorType type) {
return Types.MinorType.STRUCT == type;
}
}
View on GitHub (pinned to cf67b549a7)