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
- Replace getRawValue calls with typed accessors (getString/getBinary/getRow/getVariant) on the VariantRowDataWrapper.
- Disable raw-value passthrough in the consuming Flink operator for variant-backed rows.
- If passthrough is required, wrap the Variant itself into RawValueData at the source layer instead of reading through this wrapper.
- 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
- Access variant fields via getVariant/getBinary/getString instead of getRawValue.
- Audit Flink operator configs for raw-value passthrough when sources may surface Variant columns.
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
- Not supported yet.
- errMsg(variant, "double")
- errMsg(variant, "int")
- errMsg(variant, "long")
- errMsg(variant, "timestamp")
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)