{"record":{"id":"6387a2f03132254d","repo":"apache/iceberg","slug":"unsupported-logical-type-primitive-getoriginalt-6387a2","errorCode":null,"errorMessage":"Unsupported logical type: ${primitive.getOriginalType()}","messagePattern":"Unsupported logical 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":277,"sourceCode":"          case DECIMAL:\n            DecimalLogicalTypeAnnotation decimal =\n                (DecimalLogicalTypeAnnotation) primitive.getLogicalTypeAnnotation();\n            switch (primitive.getPrimitiveTypeName()) {\n              case BINARY:\n              case FIXED_LEN_BYTE_ARRAY:\n                return new BinaryDecimalReader(desc, decimal.getScale());\n              case INT64:\n                return new LongDecimalReader(desc, decimal.getPrecision(), decimal.getScale());\n              case INT32:\n                return new IntegerDecimalReader(desc, decimal.getPrecision(), decimal.getScale());\n              default:\n                throw new UnsupportedOperationException(\n                    \"Unsupported base type for decimal: \" + primitive.getPrimitiveTypeName());\n            }\n          case BSON:\n            return new ParquetValueReaders.ByteArrayReader(desc);\n          default:\n            throw new UnsupportedOperationException(\n                \"Unsupported logical type: \" + primitive.getOriginalType());\n        }\n      }\n\n      switch (primitive.getPrimitiveTypeName()) {\n        case FIXED_LEN_BYTE_ARRAY:\n        case BINARY:\n          if (expected != null && expected.typeId() == TypeID.UUID) {\n            return new UUIDReader(desc);\n          }\n          return new ParquetValueReaders.ByteArrayReader(desc);\n        case INT32:\n          if (expected != null && expected.typeId() == TypeID.LONG) {\n            return new IntAsLongReader(desc);\n          } else {\n            return new UnboxedReader<>(desc);\n          }\n        case FLOAT:","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java#L259-L295","documentation":"SparkParquetReaders switch on the Parquet original (logical) type annotation to pick a reader. A logical type it does not handle (anything outside the known set like UTF8, DATE, DECIMAL, TIMESTAMP, etc.) raises UnsupportedOperationException, meaning Iceberg's Spark reader cannot interpret that Parquet column.","triggerScenarios":"Reading Parquet files whose columns carry unusual or proprietary logical type annotations (original types) not mapped by the reader, e.g. unusual interval or JSON annotations.","commonSituations":"Files written by other engines (Impala, Hive, custom writers) with logical types Iceberg doesn't support; schema evolution from external tools.","solutions":["Rewrite the files through Iceberg so logical types conform to the Iceberg spec.","Map unsupported columns to supported types (e.g. cast to string) at write time in the producing system.","Inspect the Parquet schema to identify which column and annotation triggers it."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"Set<OriginalType> supported = Set.of(UTF8, DATE, DECIMAL, TIMESTAMP_MILLIS, TIMESTAMP_MICROS, INT_8, INT_16, INT_32, INT_64, TIME_MICROS, ENUM, JSON, BSON);\nfor (ColumnDescriptor cd : schema.getColumns()) {\n  if (cd.getPrimitiveType().getOriginalType() != null && !supported.contains(cd.getPrimitiveType().getOriginalType()))\n    throw new IllegalStateException(\"unsupported logical type: \" + cd.getPrimitiveType().getOriginalType());\n}","typeGuard":null,"tryCatchPattern":"try {\n  spark.read.format(\"iceberg\").load(\"tbl\");\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Unsupported logical type\")) {\n    // rewrite the files with Iceberg to normalize annotations\n  }\n}","preventionTips":["Normalize external files through an Iceberg rewrite before querying.","Keep Impala/Hive-written files converted before use."],"tags":["parquet","spark","logical-type","reader"],"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-14T21:17:11.552Z"}