{"record":{"id":"ff3112bd88a26a23","repo":"apache/iceberg","slug":"unknown-logical-type-logicaltype-ff3112","errorCode":null,"errorMessage":"Unknown logical type: ${logicalType}","messagePattern":"Unknown logical type: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/data/SparkPlannedAvroReader.java","lineNumber":162,"sourceCode":"          case \"timestamp-millis\":\n            // adjust to microseconds\n            ValueReader<Long> longs = ValueReaders.longs();\n            return (ValueReader<Long>) (decoder, ignored) -> longs.read(decoder, null) * 1000L;\n\n          case \"timestamp-micros\":\n            // Spark uses the same representation\n            return ValueReaders.longs();\n\n          case \"decimal\":\n            return SparkValueReaders.decimal(\n                ValueReaders.decimalBytesReader(primitive),\n                ((LogicalTypes.Decimal) logicalType).getScale());\n\n          case \"uuid\":\n            return SparkValueReaders.uuids();\n\n          default:\n            throw new IllegalArgumentException(\"Unknown logical type: \" + logicalType);\n        }\n      }\n\n      switch (primitive.getType()) {\n        case NULL:\n          return ValueReaders.nulls();\n        case BOOLEAN:\n          return ValueReaders.booleans();\n        case INT:\n          if (partner != null && partner.typeId() == Type.TypeID.LONG) {\n            return ValueReaders.intsAsLongs();\n          }\n          return ValueReaders.ints();\n        case LONG:\n          return ValueReaders.longs();\n        case FLOAT:\n          if (partner != null && partner.typeId() == Type.TypeID.DOUBLE) {\n            return ValueReaders.floatsAsDoubles();","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/data/SparkPlannedAvroReader.java#L144-L180","documentation":"SparkPlannedAvroReader maps Avro logical types (date, timestamp-millis, decimal, uuid, etc.) to value readers. An Avro logical type name outside the recognized set triggers IllegalArgumentException('Unknown logical type: ...').","triggerScenarios":"Reading an Avro-backed Iceberg file whose schema declares a logical type the reader doesn't know (custom or newer logical type names).","commonSituations":"Avro files produced by external tools with custom logical types; reading files written by newer Iceberg/Avro versions with logical types unknown to the runtime's reader.","solutions":["Upgrade Iceberg so the reader recognizes the logical type.","Remove or convert the custom logical-typed field before writing files.","Strip or change the logical type annotation in the producing Avro schema."],"exampleFix":"// before\n{\"name\":\"f\",\"type\":\"long\",\"logicalType\":\"custom-thing\"}\n// after\n{\"name\":\"f\",\"type\":\"long\"}","handlingStrategy":"validation","validationCode":"Schema avroSchema = new Schema.Parser().parse(schemaJson);\nfor (Field f : avroSchema.getFields()) {\n  LogicalType lt = f.schema().getLogicalType();\n  if (lt != null && !Set.of(\"date\",\"timestamp-millis\",\"timestamp-micros\",\"decimal\",\"uuid\",\"time-millis\",\"time-micros\").contains(lt.getName()))\n    throw new IllegalStateException(\"unknown logical type: \" + lt.getName());\n}","typeGuard":null,"tryCatchPattern":"try {\n  reader = SparkPlannedAvroReader.create(avroSchema);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Unknown logical type\")) {\n    // strip/convert the custom logical type and retry\n  }\n}","preventionTips":["Stick to standard Avro logical types when producing files.","Upgrade Iceberg before reading files from newer producers."],"tags":["avro","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"}