apache/iceberg · error · IllegalArgumentException
Cannot convert dict encoded field '%s' of type '%s' to Arrow
Error message
Cannot convert dict encoded field '%s' of type '%s' to Arrow vector as it is currently not supported
What it means
DictEncodedArrowConverter.toArrowVector only supports dictionary-encoded fields of INT, LONG, FLOAT, DOUBLE, BINARY, and TIME Iceberg types. Any other dict-encoded type reaching the converter throws this IllegalArgumentException naming the field and type ID.
Source
Thrown at arrow/src/main/java/org/apache/iceberg/arrow/DictEncodedArrowConverter.java:77
} else if (Type.TypeID.TIMESTAMP.equals(vectorHolder.icebergType().typeId())) {
return toTimestampVector(vectorHolder, accessor);
} else if (Type.TypeID.TIMESTAMP_NANO.equals(vectorHolder.icebergType().typeId())) {
return toTimestampNanoVector(vectorHolder, accessor);
} else if (Type.TypeID.LONG.equals(vectorHolder.icebergType().typeId())) {
return toBigIntVector(vectorHolder, accessor);
} else if (Type.TypeID.FLOAT.equals(vectorHolder.icebergType().typeId())) {
return toFloat4Vector(vectorHolder, accessor);
} else if (Type.TypeID.DOUBLE.equals(vectorHolder.icebergType().typeId())) {
return toFloat8Vector(vectorHolder, accessor);
} else if (Type.TypeID.STRING.equals(vectorHolder.icebergType().typeId())) {
return toVarCharVector(vectorHolder, accessor);
} else if (Type.TypeID.BINARY.equals(vectorHolder.icebergType().typeId())) {
return toVarBinaryVector(vectorHolder, accessor);
} else if (Type.TypeID.TIME.equals(vectorHolder.icebergType().typeId())) {
return toTimeMicroVector(vectorHolder, accessor);
}
throw new IllegalArgumentException(
String.format(
"Cannot convert dict encoded field '%s' of type '%s' to Arrow "
+ "vector as it is currently not supported",
vectorHolder.icebergField().name(), vectorHolder.icebergType().typeId()));
}
return vectorHolder.vector();
}
private static DecimalVector toDecimalVector(
VectorHolder vectorHolder, ArrowVectorAccessor<?, String, ?, ?> accessor) {
int precision = ((Types.DecimalType) vectorHolder.icebergType()).precision();
int scale = ((Types.DecimalType) vectorHolder.icebergType()).scale();
DecimalVector vector =
new DecimalVector(
vectorHolder.vector().getName(),
ArrowSchemaUtil.convert(vectorHolder.icebergField()).getFieldType(),View on GitHub (pinned to 86d9c8fc54)
Solutions
- Disable dictionary encoding for that column or rewrite the data so the column uses a supported encoding.
- Disable vectorized/Arrow reads for the scan (fall back to the non-vectorized path).
- Filter or project out the unsupported column in the scan schema.
Defensive patterns
Strategy: validation
Validate before calling
Set<Type.TypeID> supported = Set.of(Type.TypeID.INT, Type.TypeID.LONG, Type.TypeID.FLOAT, Type.TypeID.DOUBLE, Type.TypeID.BINARY, Type.TypeID.TIME);
Type guard
static boolean isDictDecodable(Types.NestedField f) { return Set.of(Type.TypeID.INT, Type.TypeID.LONG, Type.TypeID.FLOAT, Type.TypeID.DOUBLE, Type.TypeID.BINARY, Type.TypeID.TIME).contains(f.type().typeId()); } Try / catch
try { return toArrowVector(holder, accessor); } catch (IllegalArgumentException e) { /* fall back to non-dict-encoded read path */ } Prevention
- Avoid dictionary encoding on DATE/TIMESTAMP/DECIMAL columns when writing Parquet for Arrow reads
- Fall back to non-vectorized reads when schemas include unusual dict-encoded types
When it happens
Trigger: Reading a data file whose dictionary-encoded column has an Iceberg type outside the supported set (e.g. dict-encoded DATE, TIMESTAMP, or DECIMAL) via the vectorized Arrow read path.
Common situations: Parquet files written by other engines with dictionary encoding on unusual column types; enabling vectorized reads on such data.
Related errors
- Unsupported primitive type:
- Cannot create expression literal from %s: %s
- Unsupported type: + type
- Unsupported binary type: + value.getClass()
- Cannot parse type string: variant is not a primitive type
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/267c5d420ca10d2c.
Report an issue: GitHub.