{"record":{"id":"529b57ee5de907fc","repo":"apache/iceberg","slug":"could-not-read-page-in-col-desc","errorCode":null,"errorMessage":"could not read page in col \" + desc","messagePattern":"could not read page in col \" \\+ desc","errorType":"exception","errorClass":"ParquetDecodingException","httpStatus":null,"severity":"error","filePath":"arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java","lineNumber":94,"sourceCode":"      if (dictionary == null) {\n        throw new ParquetDecodingException(\n            \"could not read page in col \"\n                + desc\n                + \" as the dictionary was missing for encoding \"\n                + dataEncoding);\n      }\n      try {\n        dictionaryEncodedValuesReader =\n            new VectorizedDictionaryEncodedParquetValuesReader(\n                desc.getMaxDefinitionLevel(), setArrowValidityVector);\n        dictionaryEncodedValuesReader.initFromPage(valueCount, in);\n        if (ParquetUtil.isIntType(desc.getPrimitiveType()) || !allPagesDictEncoded) {\n          dictionaryDecodeMode = DictionaryDecodeMode.EAGER;\n        } else {\n          dictionaryDecodeMode = DictionaryDecodeMode.LAZY;\n        }\n      } catch (IOException e) {\n        throw new ParquetDecodingException(\"could not read page in col \" + desc, e);\n      }\n    } else {\n      switch (dataEncoding) {\n        case PLAIN:\n          valuesReader = new VectorizedPlainValuesReader();\n          break;\n        case DELTA_BINARY_PACKED:\n          valuesReader = new VectorizedDeltaEncodedValuesReader();\n          break;\n        case DELTA_LENGTH_BYTE_ARRAY:\n          valuesReader = new VectorizedDeltaLengthByteArrayValuesReader();\n          break;\n        case DELTA_BYTE_ARRAY:\n          valuesReader = new VectorizedDeltaByteArrayValuesReader();\n          break;\n        case BYTE_STREAM_SPLIT:\n          valuesReader =\n              new VectorizedByteStreamSplitValuesReader(","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java#L76-L112","documentation":"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.","triggerScenarios":"initDataReader calls dictionary.setFromPage(in) for a dictionary-encoded page and the underlying read throws IOException.","commonSituations":"Truncated data pages, transient storage IO failures (S3/HDFS), or corrupt dictionary data within the page.","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."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  // vectorized read\n} catch (ParquetDecodingException e) {\n  if (e.getMessage().startsWith(\"could not read page in col\") && isTransient(e.getCause()) && attempt < maxAttempts) {\n    // retry\n  } else throw e;\n}","preventionTips":["Use retries for transient storage IO errors during scans","Detect and rewrite truncated files promptly","Monitor storage health (network, permissions) for recurring failures"],"tags":["parquet","dictionary-encoding","io"],"backgroundTag":"file-read-failed","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}