apache/iceberg · error · UnsupportedOperationException
errMsg(variant, "int")
Error message
errMsg(variant, "int")
What it means
VariantRowDataWrapper.intValue converts a Variant value to a Flink int, but only supports TINYINT, SMALLINT, and INT variant types. If the Variant holds any other physical type (e.g. BIGINT, STRING, DOUBLE), the wrapper throws UnsupportedOperationException with errMsg(variant, "int") naming the actual type. It guards the type-narrowing read path of the RowData wrapper against silent data corruption.
Source
Thrown at flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java:255
}
int arraySize = BinaryVariantAccessorUtils.arraySize(variant);
Object[] elements = new Object[arraySize];
for (int i = 0; i < arraySize; i++) {
Variant element = variant.getElement(i);
elements[i] = elementValue(element, innerElementType);
}
return new GenericArrayData(elements);
}
private static int intValue(Variant variant) {
return switch (variant.getType()) {
case TINYINT -> variant.getByte();
case SMALLINT -> variant.getShort();
case INT -> variant.getInt();
default -> throw new UnsupportedOperationException(errMsg(variant, "int"));
};
}
private static long longValue(Variant variant) {
return switch (variant.getType()) {
case TINYINT -> variant.getByte();
case SMALLINT -> variant.getShort();
case INT -> variant.getInt();
case BIGINT -> variant.getLong();
default -> throw new UnsupportedOperationException(errMsg(variant, "long"));
};
}
private static double doubleValue(Variant variant) {
return switch (variant.getType()) {
case FLOAT -> variant.getFloat();
case DOUBLE -> variant.getDouble();
default -> throw new UnsupportedOperationException(errMsg(variant, "double"));View on GitHub (pinned to 86d9c8fc54)
Solutions
- Check the variant's actual stored type and read it with a matching Flink logical type (BIGINT -> getLong, etc.).
- Fix the schema/type mapping so the Flink field type matches the variant's declared physical type.
- If casting is intended, convert the variant value (e.g. via variant type switch or SQL CAST) before wrapping.
Example fix
// before
int v = wrapper.getInt(variantPos);
// after
if (variant.getType() == Variant.Type.BIGINT) {
long v = wrapper.getLong(variantPos);
} Defensive patterns
Strategy: type-guard
Validate before calling
if (variant.getType() == Variant.Type.TINYINT || variant.getType() == Variant.Type.SMALLINT || variant.getType() == Variant.Type.INT) { /* safe to getInt */ } Type guard
boolean isIntVariant(Variant v) { return switch (v.getType()) { case TINYINT, SMALLINT, INT -> true; default -> false; }; } Try / catch
try { int v = wrapper.getInt(pos); } catch (UnsupportedOperationException e) { /* fallback: read via matching accessor or log type mismatch */ } Prevention
- Verify the variant's stored type before mapping it to a Flink field type.
- Keep the Iceberg/Flink schema in sync with the data written into variant columns.
- Add unit tests covering each variant physical type per Flink field type.
When it happens
Trigger: Calling RowDataWrapper.getInt(pos) (directly or via elementValue for array/map elements) when the underlying Variant at that position has getType() other than TINYINT, SMALLINT, or INT — e.g. reading a BIGINT or string variant through an INTEGER-typed Flink field.
Common situations: Schema drift between the declared Flink/iceberg type and actual variant contents; reading variant columns with a wrong Flink physical type mapping; unit tests feeding an arbitrary variant into an INT-typed wrapper.
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
- Failed to read Variant %s of type %s as int
- Failed to read Variant %s of type %s as long
- Failed to read Variant %s of type %s as double
- Failed to read Variant %s of type %s as timestamp
- errMsg(variant, "long")
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/abc1a6b2cbc5cd76.
Report an issue: GitHub.