apache/iceberg · error · UnsupportedOperationException

readDouble is not supported

Error message

readDouble is not supported

What it means

readDouble() on VectorizedValuesReader has a default implementation that throws UnsupportedOperationException because the interface cannot know how to decode doubles from every page encoding. Only subclasses that support double decoding override it. Hitting this error means the vectorized decoder was asked to read a DOUBLE column through a reader class that does not implement double reads.

Source

Thrown at arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedValuesReader.java:71

  /** Read a single integer */
  default int readInteger() {
    throw new UnsupportedOperationException("readInteger is not supported");
  }

  /** Read a single long */
  default long readLong() {
    throw new UnsupportedOperationException("readLong is not supported");
  }

  /** Read a single float */
  default float readFloat() {
    throw new UnsupportedOperationException("readFloat is not supported");
  }

  /** Read a single double */
  default double readDouble() {
    throw new UnsupportedOperationException("readDouble is not supported");
  }

  /**
   * Read binary data of some length
   *
   * @param len The number of bytes to read
   */
  default Binary readBinary(int len) {
    throw new UnsupportedOperationException("readBinary is not supported");
  }

  /** Read `total` integers into `vec` starting at `vec[rowId]` */
  default void readIntegers(int total, FieldVector vec, int rowId) {
    throw new UnsupportedOperationException("readIntegers is not supported");
  }

  /** Read `total` longs into `vec` starting at `vec[rowId]` */
  default void readLongs(int total, FieldVector vec, int rowId) {

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Disable vectorized reads for the read (read.arrow.enabled=false) to fall back to the generic Parquet reader.
  2. Upgrade Iceberg; vectorized support for this type/encoding may exist in newer releases.
  3. If implementing a reader, override readDouble() to decode from the initialized page stream.

Example fix

// before
// default readDouble() throws
// after
@Override
public double readDouble() { return Double.longBitsToDouble(readLong()); }
Defensive patterns

Strategy: fallback

Validate before calling

// avoid vectorized path for double columns when unsupported
if (schema.columns().stream().anyMatch(c -> c.type().equals(Types.DoubleType.get())) && !doubleBatchSupported) {
  props.put("read.arrow.enabled", "false");
}

Prevention

When it happens

Trigger: VectorizedPageReader.nextVal() dispatches to readDouble() for a Parquet DOUBLE column while the active reader is the default/unimplemented one, e.g. because the reader factory had no vectorized implementation for this physical type or encoding (such as certain dictionary encodings).

Common situations: Queries over double columns with Arrow vectorized reads enabled on an Iceberg version lacking that support path; encodings (e.g. plain/dictionary combinations) whose dedicated reader omits readDouble; custom readers.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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