prestodb/presto · error · IllegalArgumentException

Unsupported Parquet type:

Error message

Unsupported Parquet type: 

What it means

Thrown by getColumnIndexConversions in TupleDomainParquetPredicate when building a converter that decodes Parquet ColumnIndex (page-level min/max) values into Java objects for predicate pushdown. The switch covers BOOLEAN, INT32, INT64, FLOAT, DOUBLE, BINARY, FIXED_LEN_BYTE_ARRAY and INT96; any other primitive type name reaches the default branch and fails. Like the dictionary converter, all current enum members are handled, so it only triggers with an unrecognized type value.

Source

Thrown at presto-parquet/src/main/java/com/facebook/presto/parquet/predicate/TupleDomainParquetPredicate.java:705

        private Function<Object, Object> getColumnIndexConversions(PrimitiveType type)
        {
            switch (type.getPrimitiveTypeName()) {
                case BOOLEAN:
                    return buffer -> ((ByteBuffer) buffer).get(0) != 0;
                case INT32:
                    return buffer -> (long) ((ByteBuffer) buffer).order(LITTLE_ENDIAN).getInt(0);
                case INT64:
                    return buffer -> ((ByteBuffer) buffer).order(LITTLE_ENDIAN).getLong(0);
                case FLOAT:
                    return buffer -> ((ByteBuffer) buffer).order(LITTLE_ENDIAN).getFloat(0);
                case DOUBLE:
                    return buffer -> ((ByteBuffer) buffer).order(LITTLE_ENDIAN).getDouble(0);
                case BINARY:
                case FIXED_LEN_BYTE_ARRAY:
                case INT96:
                    return binary -> ByteBuffer.wrap(((Binary) binary).getBytes());
                default:
                    throw new IllegalArgumentException("Unsupported Parquet type: " + type.getPrimitiveTypeName());
            }
        }
    }
}

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Upgrade to a Presto release that supports the primitive type present in the file.
  2. Add a case for the missing PrimitiveTypeName in getColumnIndexConversions, returning the correct ByteBuffer decoder.
  3. Work around by dropping or rewriting the column index (rewrite file with parquet-tools rewrite or disable column-index filtering for that column).
  4. Inspect the file's column statistics types with parquet-tools to confirm the offending type.

Example fix

// before
default:
    throw new IllegalArgumentException("Unsupported Parquet type: " + type.getPrimitiveTypeName());

// after
case NEW_PRIMITIVE_TYPE:
    return binary -> ByteBuffer.wrap(((Binary) binary).getBytes());
default:
    throw new IllegalArgumentException("Unsupported Parquet type: " + type.getPrimitiveTypeName());
Defensive patterns

Strategy: validation

Validate before calling

// Guard before enabling column-index based filtering
PrimitiveTypeName name = type.getPrimitiveTypeName();
boolean supported = name == PrimitiveTypeName.BOOLEAN || name == PrimitiveTypeName.INT32 ||
    name == PrimitiveTypeName.INT64 || name == PrimitiveTypeName.FLOAT ||
    name == PrimitiveTypeName.DOUBLE || name == PrimitiveTypeName.BINARY ||
    name == PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY || name == PrimitiveTypeName.INT96;
if (!supported) { /* disable column index pushdown for this column */ }

Prevention

When it happens

Trigger: getColumnIndexConversions(type) is called while reading a column's Parquet ColumnIndex statistics and the column's PrimitiveTypeName is not among the eight handled values — realistically only a newly introduced PrimitiveTypeName enum value from a newer parquet-mr, since BOOLEAN and all numeric/binary types are covered.

Common situations: Mixed-version clusters where files written by a newer Parquet writer (new primitive type) are read by an older Presto build; library dependency drift where presto-parquet pulls an older parquet-column enum than the writer used.

Related errors


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