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

  1. Upgrade the Iceberg/parquet-mr dependency to a version that supports the logical type
  2. Remove or rewrite the offending column annotation before writing
  3. 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

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


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/0efdfec1fd2855e9. Report an issue: GitHub.