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

  1. Check which key is reported and add/register a converter for that Arrow child type, or upgrade SeaTunnel to a version that supports it
  2. Inspect the Arrow schema upstream and cast unsupported columns to supported types (e.g. cast Decimal to Double) before they reach the source
  3. 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

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


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)