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

  1. Upgrade presto-orc so the encoding kind is mapped
  2. Check the message for the offending kind and add the missing case in toColumnEncoding() if forking
  3. 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

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


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