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
- Disable vectorized reads for the read (read.arrow.enabled=false) to fall back to the generic Parquet reader.
- Upgrade Iceberg; vectorized support for this type/encoding may exist in newer releases.
- 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
- Match read.arrow.enabled to types known to be vectorized in your release.
- Test scan of every column type in your schema with vectorization on before production.
- Wrap vectorized scans with a fallback to the generic Parquet reader.
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
- readLong is not supported
- readFloat is not supported
- readBinary is not supported
- readIntegers is not supported
- readLongs is not supported
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/5a210285bebc6506.
Report an issue: GitHub.