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
- Regenerate the parquet data with a writer that emits the full variant key/metadata/value group
- 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.