apache/iceberg · error · UnsupportedOperationException

Unsupported variant: shredded typed_value primitive

Error message

Unsupported variant: shredded typed_value primitive

What it means

VectorizedVariantVisitor.primitive handles the Variant shredded typed_value column. When the typed_value is shredded as a bare primitive type, this visitor cannot produce a reader and throws UnsupportedOperationException — primitive shredding of Variant typed_value is not supported by this vectorized visitor.

Solutions

  1. Upgrade Iceberg on the reader side to a version supporting primitive-typed_value shredding
  2. Disable vectorized reads for variant columns / read via the non-vectorized path
  3. Rewrite (compaction) with shredding disabled or with a supported shred layout

Example fix

// before
spark.read.option("vectorized-reader-enabled", "true").load("variant_table")
// after
spark.read.option("vectorized-reader-enabled", "false").load("variant_table")
Defensive patterns

Strategy: fallback

Validate before calling

// inspect shredding schema of typed_value
if (typedValueField.getType().isPrimitive()) {
  // unsupported: use non-vectorized variant reader
}

Try / catch

try {
  return variantVisitor.build();
} catch (UnsupportedOperationException e) {
  return nonVectorizedVariantReader();
}

Prevention

When it happens

Trigger: Reading a table with Variant columns whose Parquet shredding encodes typed_value as a primitive (per newer shred-variant specs) via the vectorized variant reader; the visitor's primitive() callback fires and throws.

Common situations: Variant data shredded by a newer writer/Spark version while the reader's Iceberg version lacks primitive-shredding support; version mismatch between writer and reader shred encodings.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/2e02afc605c69289. Report an issue: GitHub.

Appendix: source

Thrown at arrow/src/main/java/org/apache/iceberg/arrow/vectorized/VectorizedVariantVisitor.java:97

  @Override
  public VectorizedReader<?> variant(
      GroupType variant, VectorizedReader<?> metadataResult, VectorizedReader<?> valueResult) {
    if (metadataResult instanceof VectorizedArrowReader
        && valueResult instanceof VectorizedArrowReader) {
      Types.NestedField field = findVariantField(variant);
      if (field != null) {
        return new VectorizedArrowReader.VectorizedVariantReader(
            field, (VectorizedArrowReader) metadataResult, (VectorizedArrowReader) valueResult);
      }
    }

    return null;
  }

  @Override
  public VectorizedReader<?> primitive(PrimitiveType primitive) {
    throw new UnsupportedOperationException("Unsupported variant: shredded typed_value primitive");
  }

  @Override
  public VectorizedReader<?> value(
      GroupType value, VectorizedReader<?> valueResult, VectorizedReader<?> typedResult) {
    if (typedResult != null) {
      throw new UnsupportedOperationException(
          "Unsupported variant: shredded typed_value primitive");
    }
    return valueResult;
  }

  @Override
  public VectorizedReader<?> object(
      GroupType object, VectorizedReader<?> valueResult, List<VectorizedReader<?>> fieldResults) {
    throw new UnsupportedOperationException(
        "Unsupported variant: shredded typed_value object with " + fieldResults.size() + " fields");
  }

View on GitHub (pinned to 86d9c8fc54)