prestodb/presto · error · IllegalArgumentException

Metadata field is missing for variant type:

Error message

Metadata field is missing for variant type: 

What it means

Guard in constructField for VARIANT (JSON) typed columns: the parquet variant group lacks the required 'metadata' child field, making the variant encoding incomplete. Fires while mapping a parquet schema to Presto types when the variant group's children do not include metadata.

Source

Thrown at presto-parquet/src/main/java/org/apache/parquet/io/ColumnIOConverter.java:111

                List<Type> types = type.getTypeParameters();
                if (groupColumnIO.getChildrenCount() != 1) {
                    return Optional.empty();
                }
                Optional<Field> field = constructField(types.get(0), getArrayElementColumn(groupColumnIO.getChild(0)));
                return Optional.of(new GroupField(type, repetitionLevel, definitionLevel, required, ImmutableList.of(field)));
            }
            else if (JSON.equals(type.getTypeSignature().getBase())) {
                GroupColumnIO groupColumnIO = (GroupColumnIO) columnIO;
                if (groupColumnIO.getChildrenCount() != 2) {
                    return Optional.empty();
                }
                Optional<Field> value = constructField(VarbinaryType.VARBINARY, groupColumnIO.getChild(0));
                if (!value.isPresent()) {
                    throw new IllegalArgumentException("Value field is missing for variant type: " + type);
                }
                Optional<Field> metadata = constructField(VarbinaryType.VARBINARY, groupColumnIO.getChild(1));
                if (!metadata.isPresent()) {
                    throw new IllegalArgumentException("Metadata field is missing for variant type: " + type);
                }
                return Optional.of(new VariantField(type, repetitionLevel, definitionLevel, required, value.get(), metadata.get()));
            }
        }
        else if (columnIO instanceof PrimitiveColumnIO) {
            PrimitiveColumnIO primitiveColumnIO = (PrimitiveColumnIO) columnIO;
            RichColumnDescriptor column = new RichColumnDescriptor(primitiveColumnIO.getColumnDescriptor(), columnIO.getType().asPrimitiveType());
            return Optional.of(new PrimitiveField(type, repetitionLevel, definitionLevel, required, column, primitiveColumnIO.getId()));
        }
        return Optional.empty();
    }

    public static Optional<ColumnIO> findNestedColumnIO(ColumnIO columnIO, List<String> path)
    {
        if (columnIO == null) {
            return Optional.empty();
        }

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Regenerate the parquet data with a writer that emits the full variant key/metadata/value group
  2. Verify the variant schema follows the expected shimplified/shredded layout
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at presto-parquet/src/main/java/org/apache/parquet/io/ColumnIOConverter.java:111 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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