prestodb/presto · error · ParquetDecodingException
Unsupported Parquet encoding:
Error message
Unsupported Parquet encoding:
What it means
getParquetTypeUtils.getParquetEncoding maps Parquet's Encoding enum to the library's ParquetEncoding, and the default branch throws a ParquetDecodingException for any encoding it does not recognize. This means the file was written with an encoding this Presto-parquet build cannot decode — typically a newer encoding added after this code was compiled. The failure is unavoidable at read time without upgrading or rewriting the data.
Source
Thrown at presto-parquet/src/main/java/com/facebook/presto/parquet/ParquetTypeUtils.java:176
switch (encoding) {
case PLAIN:
return ParquetEncoding.PLAIN;
case RLE:
return ParquetEncoding.RLE;
case BIT_PACKED:
return ParquetEncoding.BIT_PACKED;
case PLAIN_DICTIONARY:
return ParquetEncoding.PLAIN_DICTIONARY;
case DELTA_BINARY_PACKED:
return ParquetEncoding.DELTA_BINARY_PACKED;
case DELTA_LENGTH_BYTE_ARRAY:
return ParquetEncoding.DELTA_LENGTH_BYTE_ARRAY;
case DELTA_BYTE_ARRAY:
return ParquetEncoding.DELTA_BYTE_ARRAY;
case RLE_DICTIONARY:
return ParquetEncoding.RLE_DICTIONARY;
default:
throw new ParquetDecodingException("Unsupported Parquet encoding: " + encoding);
}
}
public static org.apache.parquet.schema.Type getParquetTypeByName(String columnName, GroupType messageType)
{
if (messageType.containsField(columnName)) {
return messageType.getType(columnName);
}
// parquet is case-sensitive, but hive is not. all hive columns get converted to lowercase
// check for direct match above but if no match found, try case-insensitive match
for (org.apache.parquet.schema.Type type : messageType.getFields()) {
if (type.getName().equalsIgnoreCase(columnName)) {
return type;
}
}
return null;
}View on GitHub (pinned to 55bb57d202)
Solutions
- Identify the offending encoding from the exception text and upgrade the Presto build / bundled parquet-mr library to a version that supports it.
- Rewrite the Parquet file with an explicitly compatible encoding (e.g. SNAPPY-compressed PLAIN_DICTIONARY or RLE_DICTIONARY).
- If you control the writer, disable the new encoding (e.g. set writer version/encoding options to a compatible set).
- Check the column that failed; sometimes only one column type (e.g. FLOAT/DOUBLE with BYTE_STREAM_SPLIT) needs to be excluded or converted.
Example fix
// before: reading BYTE_STREAM_SPLIT file with old writer
spark.write().parquet("out");
// after: force compatible encodings on write
spark.conf.set("spark.sql.parquet.writer.version", "v1"); // PLAIN_DICTIONARY/RLE
spark.write().parquet("out"); Defensive patterns
Strategy: fallback
Validate before calling
// preflight: inspect encodings present in the file footer
for (ColumnChunkMetaData cc : footer.getBlocks().stream().flatMap(b -> b.getColumns().stream()).collect(toList())) {
if (!SUPPORTED_ENCODINGS.contains(cc.getEncoding())) {
throw new IllegalStateException("Unsupported encoding " + cc.getEncoding() + " in column " + cc.getPath());
}
} Try / catch
try {
parquetRecordReader.nextRecord();
} catch (ParquetDecodingException e) {
if (e.getMessage().startsWith("Unsupported Parquet encoding")) {
// route file to a rewrite job with compatible encodings
} else { throw e; }
} Prevention
- Pin parquet writer settings to encodings your reader version supports.
- Keep the parquet-mr dependency in the Presto build current with your writers.
- Scan new file footers for unknown encodings before registering partitions.
When it happens
Trigger: Reading a Parquet column chunk whose page header declares an encoding enum value not handled by the switch (anything outside PLAIN, PLAIN_DICTIONARY, RLE, BIT_PACKED, DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY, RLE_DICTIONARY).
Common situations: Files written by newer Parquet/Spark versions using encodings unknown to an old bundled parquet-mr; BYTE_STREAM_SPLIT encoded data; future/experimental encodings from other engines (e.g. newer writer defaults).
Related errors
- Failed to decode.
- We didn't read correct number of definitionLevels
- Still remaining to be read in current batch.
- Corrupted Parquet file: extra %d values to be consumed when
- Still remaining to be read in current batch.
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/ca0bc3e04dcf5c35.
Report an issue: GitHub.