prestodb/presto · error · IllegalArgumentException
Unsupported column encoding kind:
Error message
Unsupported column encoding kind:
What it means
OrcMetadataWriter.toColumnEncoding() maps internal ColumnEncodingKind values to ORC protobuf ColumnEncoding.Kind when writing column metadata. An unmapped encoding kind triggers IllegalArgumentException("Unsupported column encoding kind: ..."). It guards against serializing encodings the ORC protobuf schema cannot represent.
Source
Thrown at presto-orc/src/main/java/com/facebook/presto/orc/metadata/OrcMetadataWriter.java:369
return OrcProto.ColumnEncoding.newBuilder()
.setKind(toColumnEncoding(columnEncodings.getColumnEncodingKind()))
.setDictionarySize(columnEncodings.getDictionarySize())
.build();
}
private static OrcProto.ColumnEncoding.Kind toColumnEncoding(ColumnEncodingKind columnEncodingKind)
{
switch (columnEncodingKind) {
case DIRECT:
return OrcProto.ColumnEncoding.Kind.DIRECT;
case DICTIONARY:
return OrcProto.ColumnEncoding.Kind.DICTIONARY;
case DIRECT_V2:
return OrcProto.ColumnEncoding.Kind.DIRECT_V2;
case DICTIONARY_V2:
return OrcProto.ColumnEncoding.Kind.DICTIONARY_V2;
}
throw new IllegalArgumentException("Unsupported column encoding kind: " + columnEncodingKind);
}
@Override
public int writeRowIndexes(SliceOutput output, List<RowGroupIndex> rowGroupIndexes)
throws IOException
{
OrcProto.RowIndex rowIndexProtobuf = OrcProto.RowIndex.newBuilder()
.addAllEntry(rowGroupIndexes.stream()
.map(OrcMetadataWriter::toRowGroupIndex)
.collect(toList()))
.build();
return writeProtobufObject(output, rowIndexProtobuf);
}
private static RowIndexEntry toRowGroupIndex(RowGroupIndex rowGroupIndex)
{
OrcProto.RowIndexEntry.Builder builder = OrcProto.RowIndexEntry.newBuilder();
for (int position : rowGroupIndex.getPositions()) {View on GitHub (pinned to 55bb57d202)
Solutions
- Upgrade presto-orc so the encoding kind is mapped
- Check the message for the offending kind and add the missing case in toColumnEncoding() if forking
- Configure the writer to use supported encodings (DIRECT/DICTIONARY variants) via column writer options
Example fix
// before
throw new IllegalArgumentException("Unsupported column encoding kind: " + columnEncodingKind);
// after
case MAP_FLAT:
return OrcProto.ColumnEncoding.Kind.MAP; // add missing mapping Defensive patterns
Strategy: try-catch
Try / catch
try {
orcWriter.close();
} catch (IllegalArgumentException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Unsupported column encoding kind:")) {
throw new IOException("Column encoding not serializable by this writer version: " + e.getMessage(), e);
}
throw e;
} Prevention
- Use default column encoding options unless a fork adds kinds deliberately
- Add encoder-kind mappings when adding new column writers
- Round-trip test encodings against the reader
When it happens
Trigger: Writing column encodings for an ORC file where a ColumnEncodingKind (e.g. a new DICTIONARY variant) is not handled in the switch in toColumnEncoding().
Common situations: Newer encoding variants added internally but not mapped to protobuf; fork maintenance drift; version mismatch between column writers and metadata writer.
Related errors
- Unsupported stream kind:
- Unsupported type:
- Unsupported compression kind:
- Unsupported type:
- NOT_SUPPORTED
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/1cc764a4d79abbeb.
Report an issue: GitHub.