{"record":{"id":"796186f204611f48","repo":"apache/iceberg","slug":"unsupported-type-primitive-796186","errorCode":null,"errorMessage":"Unsupported type: ${primitive}","messagePattern":"Unsupported type: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java","lineNumber":310,"sourceCode":"          } else {\n            return new UnboxedReader<>(desc);\n          }\n        case FLOAT:\n          if (expected != null && expected.typeId() == TypeID.DOUBLE) {\n            return new FloatAsDoubleReader(desc);\n          } else {\n            return new UnboxedReader<>(desc);\n          }\n        case BOOLEAN:\n        case INT64:\n        case DOUBLE:\n          return new UnboxedReader<>(desc);\n        case INT96:\n          // Impala & Spark used to write timestamps as INT96 without a logical type. For backwards\n          // compatibility we try to read INT96 as timestamps.\n          return ParquetValueReaders.int96Timestamps(desc);\n        default:\n          throw new UnsupportedOperationException(\"Unsupported type: \" + primitive);\n      }\n    }\n\n    protected MessageType type() {\n      return type;\n    }\n  }\n\n  private static class BinaryDecimalReader extends PrimitiveReader<Decimal> {\n    private final int scale;\n\n    BinaryDecimalReader(ColumnDescriptor desc, int scale) {\n      super(desc);\n      this.scale = scale;\n    }\n\n    @Override\n    public Decimal read(Decimal ignored) {","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java#L292-L328","documentation":"At the end of the physical-type switch in SparkParquetReaders.primitive(), any remaining Parquet primitive type without a dedicated reader throws UnsupportedOperationException('Unsupported type: ...'). This covers physical types that cannot be interpreted as an Iceberg value by the Spark read path.","triggerScenarios":"Reading a Parquet file containing a physical type the reader has no case for (besides the specially handled INT96-as-timestamp compatibility path).","commonSituations":"Exotic Parquet output from non-standard writers; corrupted column metadata; future Parquet types appearing with older Iceberg versions.","solutions":["Upgrade to a newer Iceberg version that may support the type.","Rewrite the files with Iceberg/Spark to normalize physical types.","Identify the offending column via the Parquet footer and drop or convert it."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"for (ColumnDescriptor cd : schema.getColumns()) {\n  if (!EnumSet.of(BOOLEAN,INT32,INT64,FLOAT,DOUBLE,BINARY,FIXED_LEN_BYTE_ARRAY).contains(cd.getPrimitiveType().getPrimitiveTypeName())\n      && cd.getPrimitiveType().getPrimitiveTypeName() != INT96)\n    throw new IllegalStateException(\"unsupported physical type: \" + cd.getPrimitiveType());\n}","typeGuard":null,"tryCatchPattern":"try {\n  df = spark.read.format(\"iceberg\").load(\"tbl\");\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Unsupported type:\")) {\n    // identify column, rewrite or exclude file\n  }\n}","preventionTips":["Prefer current Parquet writers; avoid exotic physical encodings.","Upgrade Iceberg before introducing files written by newer tools."],"tags":["parquet","spark","unsupported-type","reader"],"backgroundTag":"unsupported-enum-value","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"}