prestodb/presto · error · PrestoException

PARQUET_IO_READ_ERROR

PARQUET_IO_READ_ERROR

Error message

Error reading Parquet column 

What it means

BooleanFlatBatchReader.readNext catches IOExceptions while reading a flat BOOLEAN column chunk and rethrows as PrestoException with PARQUET_IO_READ_ERROR, message 'Error reading Parquet column ' + ColumnDescriptor, cause preserved. Same failure class as the binary reader but for boolean columns; the column descriptor in the message identifies the failing column. The chunk could not be read from storage/decoded at the IO level.

Source

Thrown at presto-parquet/src/main/java/com/facebook/presto/parquet/batchreader/BooleanFlatBatchReader.java:109

        readOffset = readOffset + nextBatchSize;
        nextBatchSize = batchSize;
    }

    @Override
    public ColumnChunk readNext(Optional<DateTimeZone> timezone)
    {
        ColumnChunk columnChunk = null;
        try {
            seek();
            if (field.isRequired()) {
                columnChunk = readWithoutNull();
            }
            else {
                columnChunk = readWithNull();
            }
        }
        catch (IOException exception) {
            throw new PrestoException(PARQUET_IO_READ_ERROR, "Error reading Parquet column " + columnDescriptor, exception);
        }

        readOffset = 0;
        nextBatchSize = 0;
        return columnChunk;
    }

    @Override
    public long getRetainedSizeInBytes()
    {
        return INSTANCE_SIZE +
                (definitionLevelDecoder == null ? 0 : definitionLevelDecoder.getRetainedSizeInBytes()) +
                (valuesDecoder == null ? 0 : valuesDecoder.getRetainedSizeInBytes()) +
                (dictionary == null ? 0 : dictionary.getRetainedSizeInBytes()) +
                (pageReader == null ? 0 : pageReader.getRetainedSizeInBytes());
    }

    protected boolean readNextPage()

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Check the cause chain for transient storage errors and simply retry the query if so.
  2. Validate the file with parquet-tools; if corrupt or truncated, restore from source or rewrite the table partition.
  3. Confirm storage credentials/permissions are valid for the full scan duration.
  4. If reproducible, isolate the failing column chunk metadata and investigate the writer that produced it.
Defensive patterns

Strategy: retry

Validate before calling

// preflight: open the file and read its footer before scanning boolean columns
ParquetMetadata footer = ParquetFileReader.readFooter(conf, new Path(path));
footer.getBlocks().forEach(b -> b.getColumns().forEach(c -> {
    if (c.getType().equals(PrimitiveTypeName.BOOLEAN)) { /* mark column for guarded read */ }
}));

Try / catch

try {
    column = booleanReader.readNext();
} catch (PrestoException e) {
    if (e.getErrorCode().getName().contains("PARQUET_IO_READ_ERROR") && e.getCause() instanceof IOException) {
        column = retryReadWithBackoff(booleanReader); // only retry transient IO causes
    } else { throw e; }
}

Prevention

When it happens

Trigger: readNext() on a boolean flat column when readWithNull or the underlying page readers throw IOException (unreadable page, storage error).

Common situations: S3/HDFS transient failures during scans; corrupted or truncated Parquet files; reader/writer incompatibility producing undecodable boolean RLE pages.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/3bc8bd191fe7d421. Report an issue: GitHub.