apache/iceberg · error · UnsupportedOperationException
Unsupported logical type: %s
Error message
Unsupported logical type: %s
What it means
ParquetAvroWriter.primitive encountered a Parquet logical (original) type it has no writer mapping for. Only known logical types (DECIMAL, BSON, etc.) are handled in the switch; anything else (e.g., an unrecognized or newly added logical type annotation) triggers this fallback throw.
Source
Thrown at parquet/src/main/java/org/apache/iceberg/parquet/ParquetAvroWriter.java:151
switch (primitive.getPrimitiveTypeName()) {
case INT32:
return ParquetValueWriters.decimalAsInteger(
desc, decimal.getPrecision(), decimal.getScale());
case INT64:
return ParquetValueWriters.decimalAsLong(
desc, decimal.getPrecision(), decimal.getScale());
case BINARY:
case FIXED_LEN_BYTE_ARRAY:
return ParquetValueWriters.decimalAsFixed(
desc, decimal.getPrecision(), decimal.getScale());
default:
throw new UnsupportedOperationException(
"Unsupported base type for decimal: " + primitive.getPrimitiveTypeName());
}
case BSON:
return ParquetValueWriters.byteBuffers(desc);
default:
throw new UnsupportedOperationException(
"Unsupported logical type: " + primitive.getOriginalType());
}
}
switch (primitive.getPrimitiveTypeName()) {
case FIXED_LEN_BYTE_ARRAY:
return new FixedWriter(desc);
case BINARY:
return ParquetValueWriters.byteBuffers(desc);
case BOOLEAN:
return ParquetValueWriters.booleans(desc);
case INT32:
return ParquetValueWriters.ints(desc);
case INT64:
return ParquetValueWriters.longs(desc);
case FLOAT:
return ParquetValueWriters.floats(desc);
case DOUBLE:View on GitHub (pinned to 86d9c8fc54)
Solutions
- Upgrade the Iceberg/parquet-mr dependency to a version that supports the logical type
- Remove or rewrite the offending column annotation before writing
- Use the generic Parquet writer instead of the Avro writer path
Example fix
// before: column annotated with unsupported logical type (e.g., UUID) written via Avro writer ParquetAvroWriter<?> writer = ParquetAvro.write(schema).build(); // after: bump dependency implementation "org.apache.iceberg:iceberg-parquet:1.6.0" // supports newer logical types
Defensive patterns
Strategy: validation
Validate before calling
Set<String> supported = Set.of("DECIMAL","BSON");
schema.columns().forEach(c -> { if (logicalType(c) != null && !supported.contains(logicalType(c).getName())) throw new IllegalArgumentException("Unsupported logical type: " + logicalType(c)); }); Try / catch
try { writeTask.commit(); } catch (UnsupportedOperationException e) { if (e.getMessage().startsWith("Unsupported logical type")) { /* fall back to generic writer or upgrade deps */ } else { throw e; } } Prevention
- Keep parquet-mr/Iceberg versions current when upstream engines add logical types
- Inspect file schemas (parquet-tools) for logical annotations before wiring the Avro writer
- Prefer the generic Iceberg Parquet writer for unusual logical types
When it happens
Trigger: A Parquet schema contains an OriginalType (logical type annotation) not covered by the switch in primitive() — e.g., UUID, TIME_MICROS on some paths, or a logical type added by a newer Parquet spec than this writer supports.
Common situations: Reading/writing files produced by newer Parquet libraries with logical types the pinned parquet-mr/Iceberg version does not recognize; upgrading the writing engine ahead of the Iceberg Avro writer.
Related errors
- Unknown logical type:
- Unsupported logical type: ${primitive.getOriginalType()}
- Avro writer does not support variant types
- Unsupported base type for decimal: %s
- Unsupported logical type:
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/0efdfec1fd2855e9.
Report an issue: GitHub.