{"record":{"id":"3f2ea9ddc14c991f","repo":"apache/iceberg","slug":"cannot-convert-unsupported-type-to-spark","errorCode":null,"errorMessage":"Cannot convert unsupported type to Spark: ","messagePattern":"Cannot convert unsupported type to Spark: ","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java","lineNumber":131,"sourceCode":"        } else {\n          return TimestampNTZType$.MODULE$;\n        }\n      case STRING:\n        return StringType$.MODULE$;\n      case UUID:\n        // use String\n        return StringType$.MODULE$;\n      case FIXED:\n        return BinaryType$.MODULE$;\n      case BINARY:\n        return BinaryType$.MODULE$;\n      case DECIMAL:\n        Types.DecimalType decimal = (Types.DecimalType) primitive;\n        return DecimalType$.MODULE$.apply(decimal.precision(), decimal.scale());\n      case UNKNOWN:\n        return NullType$.MODULE$;\n      default:\n        throw new UnsupportedOperationException(\n            \"Cannot convert unsupported type to Spark: \" + primitive);\n    }\n  }\n\n  private Metadata fieldMetadata(int fieldId) {\n    if (MetadataColumns.metadataFieldIds().contains(fieldId)) {\n      return new MetadataBuilder().putBoolean(METADATA_COL_ATTR_KEY, true).build();\n    }\n\n    return Metadata.empty();\n  }\n}\n","sourceCodeStart":113,"sourceCodeEnd":144,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java#L113-L144","documentation":"Fallback branch of TypeToSparkType.primitive: when an Iceberg primitive type has no mapping to a Spark type (any type not covered by the switch cases, e.g. unknown or future spec types), it throws UnsupportedOperationException with the type appended. UNKNOWN intentionally maps to NullType, so hitting this means a genuinely unmapped type was encountered.","triggerScenarios":"Converting an Iceberg schema containing a primitive type unknown to this connector version — typically a type introduced in a newer Iceberg spec being read by an older Spark connector.","commonSituations":"Iceberg library version mismatch between writer and reader (newer writer produces newer types); reading a table written by a newer Iceberg spec with an old connector jar on the classpath.","solutions":["Align the Iceberg Spark runtime version with the version used to write the table (upgrade the connector)","Check for mixed Iceberg jars on the classpath and remove stale versions","Rewrite the column to a supported type in the table schema"],"exampleFix":"// before (pom.xml)\n<dependency>org.apache.iceberg:iceberg-spark-3.4_2.12:1.4.0</dependency>\n// after — match writer version\n<dependency>org.apache.iceberg:iceberg-spark-3.5_2.12:1.6.0</dependency>","handlingStrategy":"validation","validationCode":"Schema schema = table.schema();\nschema.columns().forEach(c -> {\n  if (!SUPPORTED_PRIMITIVES.contains(c.type().typeId())) {\n    throw new IllegalStateException(\"Unmapped Iceberg type: \" + c.type());\n  }\n});","typeGuard":"static boolean mappableToSpark(Type t) { return Set.of(BOOLEAN, INT, LONG, FLOAT, DOUBLE, DATE, TIMESTAMP, STRING, BINARY, DECIMAL, FIXED, UUID).contains(t.typeId()); }","tryCatchPattern":"try { sparkType = TypeToSparkType.convert(icebergType); } catch (UnsupportedOperationException e) { throw new AnalysisException(\"Upgrade connector to read type: \" + icebergType, e); }","preventionTips":["Keep writer and reader Iceberg versions aligned across engines","Pin a single Iceberg version in your dependency management (BOM)","Scan the classpath for duplicate org.apache.iceberg jars at startup"],"tags":["spark","type-conversion","version-mismatch"],"backgroundTag":"incompatible-source-type","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"}