{"record":{"id":"3bc8bd191fe7d421","repo":"prestodb/presto","slug":"parquet-io-read-error-3bc8bd","errorCode":"PARQUET_IO_READ_ERROR","errorMessage":"Error reading Parquet column ","messagePattern":"Error reading Parquet column ","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-parquet/src/main/java/com/facebook/presto/parquet/batchreader/BooleanFlatBatchReader.java","lineNumber":109,"sourceCode":"        readOffset = readOffset + nextBatchSize;\n        nextBatchSize = batchSize;\n    }\n\n    @Override\n    public ColumnChunk readNext(Optional<DateTimeZone> timezone)\n    {\n        ColumnChunk columnChunk = null;\n        try {\n            seek();\n            if (field.isRequired()) {\n                columnChunk = readWithoutNull();\n            }\n            else {\n                columnChunk = readWithNull();\n            }\n        }\n        catch (IOException exception) {\n            throw new PrestoException(PARQUET_IO_READ_ERROR, \"Error reading Parquet column \" + columnDescriptor, exception);\n        }\n\n        readOffset = 0;\n        nextBatchSize = 0;\n        return columnChunk;\n    }\n\n    @Override\n    public long getRetainedSizeInBytes()\n    {\n        return INSTANCE_SIZE +\n                (definitionLevelDecoder == null ? 0 : definitionLevelDecoder.getRetainedSizeInBytes()) +\n                (valuesDecoder == null ? 0 : valuesDecoder.getRetainedSizeInBytes()) +\n                (dictionary == null ? 0 : dictionary.getRetainedSizeInBytes()) +\n                (pageReader == null ? 0 : pageReader.getRetainedSizeInBytes());\n    }\n\n    protected boolean readNextPage()","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-parquet/src/main/java/com/facebook/presto/parquet/batchreader/BooleanFlatBatchReader.java#L91-L127","documentation":"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.","triggerScenarios":"readNext() on a boolean flat column when readWithNull or the underlying page readers throw IOException (unreadable page, storage error).","commonSituations":"S3/HDFS transient failures during scans; corrupted or truncated Parquet files; reader/writer incompatibility producing undecodable boolean RLE pages.","solutions":["Check the cause chain for transient storage errors and simply retry the query if so.","Validate the file with parquet-tools; if corrupt or truncated, restore from source or rewrite the table partition.","Confirm storage credentials/permissions are valid for the full scan duration.","If reproducible, isolate the failing column chunk metadata and investigate the writer that produced it."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// preflight: open the file and read its footer before scanning boolean columns\nParquetMetadata footer = ParquetFileReader.readFooter(conf, new Path(path));\nfooter.getBlocks().forEach(b -> b.getColumns().forEach(c -> {\n    if (c.getType().equals(PrimitiveTypeName.BOOLEAN)) { /* mark column for guarded read */ }\n}));","typeGuard":null,"tryCatchPattern":"try {\n    column = booleanReader.readNext();\n} catch (PrestoException e) {\n    if (e.getErrorCode().getName().contains(\"PARQUET_IO_READ_ERROR\") && e.getCause() instanceof IOException) {\n        column = retryReadWithBackoff(booleanReader); // only retry transient IO causes\n    } else { throw e; }\n}","preventionTips":["Retry only IOException-backed causes; decode errors will not fix themselves.","Validate file integrity after any write/copy pipeline change.","Alert on PARQUET_IO_READ_ERROR clusters — they usually indicate a storage problem, not a query problem."],"tags":["parquet","io","boolean-column","storage"],"backgroundTag":"parquet-io-read-error","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}