apache/iceberg · error · UnsupportedOperationException

RawValue in Variant column is not supported.

Error message

RawValue in Variant column is not supported.

What it means

VariantRowDataWrapper adapts a single Flink Variant object into RowData shaped by a RowType. RawValueData access (getRawValue) has no meaning for a Variant-backed row, so it unconditionally throws UnsupportedOperationException('RawValue in Variant column is not supported.'). Callers must use the typed accessors instead.

Solutions

  1. Replace getRawValue calls with typed accessors (getString/getBinary/getRow/getVariant) on the VariantRowDataWrapper.
  2. Disable raw-value passthrough in the consuming Flink operator for variant-backed rows.
  3. If passthrough is required, wrap the Variant itself into RawValueData at the source layer instead of reading through this wrapper.
  4. Access the underlying Variant directly via getVariant(pos) and construct the value you need.

Example fix

// before
VariantPayload p = wrapper.getRawValue(pos).toObject(VariantPayload.class); // throws

// after
Variant v = wrapper.getVariant(pos);
byte[] bytes = v == null ? null : v.getBytes();
Defensive patterns

Strategy: type-guard

Validate before calling

if (row instanceof VariantRowDataWrapper) {
  throw new IllegalStateException("Use typed accessors or getVariant(), not getRawValue()");
}

Type guard

boolean supportsRawValues(RowData row) {
  return !(row instanceof VariantRowDataWrapper);
}

Try / catch

try {
  RawValueData<?> rv = row.getRawValue(pos);
} catch (UnsupportedOperationException e) {
  if (e.getMessage().contains("RawValue in Variant column")) {
    Variant v = row.getVariant(pos); // typed fallback
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling getRawValue(pos) on a VariantRowDataWrapper obtained from wrapping a Variant (e.g. via VariantRowDataWrapper(rowType).wrap(variant)), typically from Flink operators or connector code using raw-value passthrough on rows read from Variant columns.

Common situations: Flink job code or a connector applying RawValueData optimization to rows surfaced from an Iceberg variant column; generic RowData helper utilities iterating all accessors; migrating code that used getRawValue on normal rows onto variant-backed rows.

Related errors


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

Appendix: source

Thrown at flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java:145

    Variant value = field(pos);
    return isNull(value) ? null : StringData.fromString(value.getString());
  }

  @Override
  public DecimalData getDecimal(int pos, int precision, int scale) {
    Variant value = field(pos);
    return isNull(value) ? null : DecimalData.fromBigDecimal(value.getDecimal(), precision, scale);
  }

  @Override
  public TimestampData getTimestamp(int pos, int precision) {
    Variant value = field(pos);
    return isNull(value) ? null : timestampValue(value, precision);
  }

  @Override
  public <T> RawValueData<T> getRawValue(int pos) {
    throw new UnsupportedOperationException("RawValue in Variant column is not supported.");
  }

  @Override
  public byte[] getBinary(int pos) {
    Variant value = field(pos);
    return isNull(value) ? null : value.getBytes();
  }

  @Override
  public ArrayData getArray(int pos) {
    ArrayType arrayType = (ArrayType) rowType.getTypeAt(pos);
    LogicalType elementType = arrayType.getElementType();
    Variant arrayVariant = field(pos);
    return arrayDataValue(arrayVariant, elementType);
  }

  @Override
  public MapData getMap(int pos) {

View on GitHub (pinned to 86d9c8fc54)