{"record":{"id":"6823692bc32d0329","repo":"apache/iceberg","slug":"unsupported-logical-type-682369","errorCode":null,"errorMessage":"Unsupported logical type: ","messagePattern":"Unsupported logical type: ","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java","lineNumber":263,"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":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java#L245-L281","documentation":"SparkParquetReaders.primitive() handles Parquet logical (original) types. When a column carries a logical type annotation that this reader does not implement (the default branch after handling DECIMAL, BSON, etc.), it throws UnsupportedOperationException with the original type name. Reading cannot proceed for that column.","triggerScenarios":"Spark read of an Iceberg Parquet table where a column's Parquet OriginalType is one not covered by the switch (e.g. exotic/legacy logical annotations such as some converted types this branch does not map).","commonSituations":"Files produced by older or non-Iceberg Parquet writers carrying legacy ConvertedType annotations; schema drift after external tools rewrote files; reading data written by a newer Parquet logical-type spec than this reader supports.","solutions":["Identify the logical type via parquet-tools schema output and compare against the handled types in SparkParquetReaders","Rewrite the affected data files with Iceberg/Spark so columns use supported logical types (or plain physical types)","Update the Iceberg table schema so the column maps to a supported type (e.g. string/bytes instead of the unsupported annotation)","Upgrade Iceberg if the logical type is supported in newer releases"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before registering external files, check for unsupported logical annotations\nparquetSchema.getColumns().forEach(col -> {\n  OriginalType ot = col.getPrimitive().getOriginalType();\n  if (ot != null && !SUPPORTED_LOGICAL_TYPES.contains(ot)) {\n    throw new IllegalStateException(\"Unsupported logical type in file: \" + ot);\n  }\n});","typeGuard":null,"tryCatchPattern":"try {\n  spark.read().format(\"iceberg\").load(\"db.tbl\");\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Unsupported logical type\")) {\n    // rewrite the files with supported logical types, then retry the read\n  } else {\n    throw e;\n  }\n}","preventionTips":["Normalize external Parquet files through Spark/Iceberg writes before treating them as table data","Keep producer and Iceberg Parquet logical-type support versions aligned","Prefer plain physical types when the logical annotation is not needed"],"tags":["parquet","spark","logical-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"}