{"record":{"id":"4721d2bd1b99e44c","repo":"apache/iceberg","slug":"unsupported-type-4721d2","errorCode":null,"errorMessage":"Unsupported type: ","messagePattern":"Unsupported type: ","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java","lineNumber":342,"sourceCode":"          return new ParquetValueReaders.ByteArrayReader(desc);\n        case INT32:\n          if (expected.typeId() == org.apache.iceberg.types.Type.TypeID.LONG) {\n            return new ParquetValueReaders.IntAsLongReader(desc);\n          } else {\n            return new ParquetValueReaders.UnboxedReader<>(desc);\n          }\n        case FLOAT:\n          if (expected.typeId() == org.apache.iceberg.types.Type.TypeID.DOUBLE) {\n            return new ParquetValueReaders.FloatAsDoubleReader(desc);\n          } else {\n            return new ParquetValueReaders.UnboxedReader<>(desc);\n          }\n        case BOOLEAN:\n        case INT64:\n        case DOUBLE:\n          return new ParquetValueReaders.UnboxedReader<>(desc);\n        default:\n          throw new UnsupportedOperationException(\"Unsupported type: \" + primitive);\n      }\n    }\n  }\n\n  private static class BinaryDecimalReader\n      extends ParquetValueReaders.PrimitiveReader<DecimalData> {\n    private final int precision;\n    private final int scale;\n\n    BinaryDecimalReader(ColumnDescriptor desc, int precision, int scale) {\n      super(desc);\n      this.precision = precision;\n      this.scale = scale;\n    }\n\n    @Override\n    public DecimalData read(DecimalData ignored) {\n      Binary binary = column.nextBinary();","sourceCodeStart":324,"sourceCodeEnd":360,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java#L324-L360","documentation":"In FlinkParquetReaders' ReadBuilder, the primitive(...) factory maps Parquet primitive columns to Flink value readers. If a column has a logical-type annotation it is handled by the visitor; for unannotated primitives only the known parquet primitive types are supported, and anything else hits the default branch throwing UnsupportedOperationException naming the primitive.","triggerScenarios":"Reading a Parquet file whose column has a primitive type not covered by the switch (e.g. INT96 timestamps, or an annotated type the visitor declined) while using FlinkParquetReaders to build a reader for the file schema.","commonSituations":"Legacy Hive/Impala-written Parquet files using INT96 timestamps; exotic or newly added Parquet physical types; files written by tools with unusual column typing.","solutions":["Rewrite the Parquet data with standard types (e.g. convert INT96 to timestamp-millis/micros with INT64 annotation).","Ensure the requested Iceberg schema matches the file's supported primitives; avoid reading unsupported columns by projecting them out.","If a valid type is genuinely missing, extend ReadBuilder.primitive to add a reader case for it and contribute upstream."],"exampleFix":"// before: reading legacy INT96 column directly\n// after: rewrite file\n// spark.sql.parquet.int96TimestampConversion=true; rewrite table so timestamps are INT64 (TIMESTAMP_MICROS)","handlingStrategy":"fallback","validationCode":"// java\norg.apache.parquet.schema.PrimitiveType pt = column.getPrimitiveType();\nboolean readable = pt.getPrimitiveTypeName() == PrimitiveTypeName.BOOLEAN\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.INT64\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.DOUBLE\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.INT32\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.FLOAT\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.BINARY\n    || pt.getPrimitiveTypeName() == PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY;","typeGuard":null,"tryCatchPattern":"// java\ntry {\n  ParquetValueReader<?> r = FlinkParquetReaders.buildReader(...);\n} catch (UnsupportedOperationException e) {\n  // log the offending primitive, fall back to a rewrite/re-read path\n}","preventionTips":["Inspect Parquet file schemas with parquet-tools before ingesting legacy files.","Rewrite INT96/timestamp-legacy files to standard INT64 timestamp annotations.","Keep the iceberg-flink runtime at the same version as the writer that produced the files."],"tags":["flink","parquet","reader","unsupported-type"],"backgroundTag":"unsupported-operation","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"}