apache/iceberg · error · ParquetDecodingException
could not read page in col " + desc
Error message
could not read page in col " + desc
What it means
After a dictionary is present, initDataReader initializes the dictionary decoder from the page's input stream. An IOException while setting up the dictionary (reading the encoded dictionary data) is wrapped in ParquetDecodingException with the column descriptor in the message. It means the page's dictionary-encoded data could not be read from the stream.
Source
Thrown at arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java:94
if (dictionary == null) {
throw new ParquetDecodingException(
"could not read page in col "
+ desc
+ " as the dictionary was missing for encoding "
+ dataEncoding);
}
try {
dictionaryEncodedValuesReader =
new VectorizedDictionaryEncodedParquetValuesReader(
desc.getMaxDefinitionLevel(), setArrowValidityVector);
dictionaryEncodedValuesReader.initFromPage(valueCount, in);
if (ParquetUtil.isIntType(desc.getPrimitiveType()) || !allPagesDictEncoded) {
dictionaryDecodeMode = DictionaryDecodeMode.EAGER;
} else {
dictionaryDecodeMode = DictionaryDecodeMode.LAZY;
}
} catch (IOException e) {
throw new ParquetDecodingException("could not read page in col " + desc, e);
}
} else {
switch (dataEncoding) {
case PLAIN:
valuesReader = new VectorizedPlainValuesReader();
break;
case DELTA_BINARY_PACKED:
valuesReader = new VectorizedDeltaEncodedValuesReader();
break;
case DELTA_LENGTH_BYTE_ARRAY:
valuesReader = new VectorizedDeltaLengthByteArrayValuesReader();
break;
case DELTA_BYTE_ARRAY:
valuesReader = new VectorizedDeltaByteArrayValuesReader();
break;
case BYTE_STREAM_SPLIT:
valuesReader =
new VectorizedByteStreamSplitValuesReader(View on GitHub (pinned to 86d9c8fc54)
Solutions
- Retry the query to rule out transient IO/network errors.
- Validate the file; rewrite truncated or corrupt files from source.
- Check storage-layer health (connectivity, permissions) if failures are persistent.
- Fall back to non-vectorized reads while investigating.
Defensive patterns
Strategy: retry
Try / catch
try {
// vectorized read
} catch (ParquetDecodingException e) {
if (e.getMessage().startsWith("could not read page in col") && isTransient(e.getCause()) && attempt < maxAttempts) {
// retry
} else throw e;
} Prevention
- Use retries for transient storage IO errors during scans
- Detect and rewrite truncated files promptly
- Monitor storage health (network, permissions) for recurring failures
When it happens
Trigger: initDataReader calls dictionary.setFromPage(in) for a dictionary-encoded page and the underlying read throws IOException.
Common situations: Truncated data pages, transient storage IO failures (S3/HDFS), or corrupt dictionary data within the page.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Unsupported base type for decimal:
- Unsupported logical type: " + primitive.getOriginalType()
- Unsupported type: " + primitive
- Failed to read from input stream
- Failed to read bytes from stream
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/529b57ee5de907fc.
Report an issue: GitHub.