apache/iceberg · error · java.lang.UnsupportedOperationException

Unsupported element type: ${elementType}

Error message

Unsupported element type: ${elementType}

What it means

StructRowData.convertValue recursively converts Iceberg types to Flink RowData values; the default switch branch rejects any Iceberg type it cannot map for array/map elements. This UnsupportedOperationException signals an unmapped or unsupported element type in the schema.

Source

Thrown at flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/data/StructRowData.java:341

            array[index] = convertValue(elementType.asListType().elementType(), element);
          }

          index += 1;
        }
        return new GenericArrayData(array);
      case MAP:
        Types.MapType mapType = elementType.asMapType();
        Set<? extends Map.Entry<?, ?>> entries = ((Map<?, ?>) value).entrySet();
        Map<Object, Object> result = Maps.newHashMap();
        for (Map.Entry<?, ?> entry : entries) {
          final Object keyValue = convertValue(mapType.keyType(), entry.getKey());
          final Object valueValue = convertValue(mapType.valueType(), entry.getValue());
          result.put(keyValue, valueValue);
        }

        return new GenericMapData(result);
      default:
        throw new UnsupportedOperationException("Unsupported element type: " + elementType);
    }
  }
}

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Upgrade the iceberg-flink runtime to a version supporting the element type in question
  2. Rewrite the schema to use only supported element types, or cast the column
  3. Handle the field client-side by reading it as binary/string instead of typed array/map

Example fix

// before
Types.NestedField field = schema.caseInsensitiveField("variants"); // VARIANT in ARRAY
// after
field = schema.caseInsensitiveField("variants"); // read as string/binary until VARIANT arrays supported
Defensive patterns

Strategy: type-guard

Validate before calling

RowType.FieldType f = rowType.getTypeAt(i);
if (f instanceof org.apache.flink.table.types.logical.ArrayType a) {
  LogicalType el = a.getElementType(); // verify el is in supported set
}

Type guard

boolean isSupportedElementType(LogicalType t) {
  switch (t.getTypeRoot()) {
    case BOOLEAN: case INTEGER: case BIGINT: case DOUBLE: case VARCHAR:
    case BINARY: case VARBINARY: case TIMESTAMP_WITHOUT_TIME_ZONE: return true;
    default: return false;
  }
}

Try / catch

try { ArrayData arr = row.getArray(pos); }
catch (UnsupportedOperationException e) { /* handle unsupported element type: read column as string */ }

Prevention

When it happens

Trigger: Building a StructRowData over a RowType containing an array/map whose element type falls into the switch's default branch (e.g. VARIANT or other unmapped types) and iterating its values.

Common situations: Reading tables containing newer Iceberg types (variant, unknown types) with a Flink reader that predates support for them.

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/970db9ac180c3596. Report an issue: GitHub.