{"record":{"id":"b4fc7013a42ed3dc","repo":"apache/iceberg","slug":"not-implemented-for-variant-b4fc70","errorCode":null,"errorMessage":"Not implemented for variant","messagePattern":"Not implemented for variant","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java","lineNumber":64,"sourceCode":"          visit(((MapType) type).keyType(), visitor),\n          visit(((MapType) type).valueType(), visitor));\n\n    } else if (type instanceof ArrayType) {\n      return visitor.array((ArrayType) type, visit(((ArrayType) type).elementType(), visitor));\n\n    } else if (type instanceof VariantType) {\n      return visitor.variant((VariantType) type);\n\n    } else if (type instanceof UserDefinedType) {\n      throw new UnsupportedOperationException(\"User-defined types are not supported\");\n\n    } else {\n      return visitor.atomic(type);\n    }\n  }\n\n  public T variant(VariantType variant) {\n    throw new UnsupportedOperationException(\"Not implemented for variant\");\n  }\n\n  public T struct(StructType struct, List<T> fieldResults) {\n    return null;\n  }\n\n  public T field(StructField field, T typeResult) {\n    return null;\n  }\n\n  public T array(ArrayType array, T elementResult) {\n    return null;\n  }\n\n  public T map(MapType map, T keyResult, T valueResult) {\n    return null;\n  }\n","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java#L46-L82","documentation":"The SparkTypeVisitor base exposes a variant() hook for Spark's VariantType, but the default implementation (and this dispatch layer) throws UnsupportedOperationException. Variants require explicit support in the concrete visitor; using a visitor that has not implemented it against a schema containing a VariantType column fails.","triggerScenarios":"Calling SparkTypeVisitor.visit on a schema that contains a VariantType (Spark semi-structured JSON type) while the concrete visitor does not override variant().","commonSituations":"Schemas from Spark 4.x semi-structured sources (e.g. JSON ingestion as variant); generic schema-inspection tooling hitting Iceberg/Spark versions where variant is not supported on this code path.","solutions":["Avoid variant columns on this code path — cast them to string/JSON-typed columns instead","Implement variant() in your concrete SparkTypeVisitor subclass to handle VariantType explicitly","Upgrade iceberg-spark to a release where the caller's visitor supports variant types"],"exampleFix":"// before\nclass MyVisitor extends SparkTypeVisitor<String> {} // variant() throws\n// after\nclass MyVisitor extends SparkTypeVisitor<String> {\n  @Override public String variant(VariantType variant) { return \"variant\"; }\n}","handlingStrategy":"validation","validationCode":"boolean hasVariant = java.util.Arrays.stream(schema.fields()).anyMatch(f -> f.dataType() instanceof VariantType);\nif (hasVariant && !visitorSupportsVariant) throw new IllegalArgumentException(\"Variant column present but visitor lacks variant() support\");","typeGuard":"boolean isVariant(DataType t) { return t instanceof VariantType; }","tryCatchPattern":"try { visit(schema, visitor); } catch (UnsupportedOperationException e) { if (e.getMessage().contains(\"Not implemented for variant\")) { /* cast variant to string or implement variant() */ } throw e; }","preventionTips":["Override variant() in custom SparkTypeVisitor subclasses","Cast variant columns to string/JSON when variant is not supported on your path","Confirm variant support in your iceberg-spark version before using semi-structured ingestion"],"tags":["spark","variant","visitor","unsupported-operation"],"backgroundTag":"method-not-implemented","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}