{"record":{"id":"49487ac1031f8bdd","repo":"apache/iceberg","slug":"unsupported-type-byte","errorCode":null,"errorMessage":"Unsupported type - byte","messagePattern":"Unsupported type - byte","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java","lineNumber":90,"sourceCode":"\n  @Override\n  public int numNulls() {\n    return nullabilityHolder.numNulls();\n  }\n\n  @Override\n  public boolean isNullAt(int rowId) {\n    return nullabilityHolder.isNullAt(rowId) == 1;\n  }\n\n  @Override\n  public boolean getBoolean(int rowId) {\n    return accessor.getBoolean(rowId);\n  }\n\n  @Override\n  public byte getByte(int rowId) {\n    throw new UnsupportedOperationException(\"Unsupported type - byte\");\n  }\n\n  @Override\n  public short getShort(int rowId) {\n    throw new UnsupportedOperationException(\"Unsupported type - short\");\n  }\n\n  @Override\n  public int getInt(int rowId) {\n    return accessor.getInt(rowId);\n  }\n\n  @Override\n  public long getLong(int rowId) {\n    return accessor.getLong(rowId);\n  }\n\n  @Override","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java#L72-L108","documentation":"IcebergArrowColumnVector adapts Arrow columnar data to Spark's ColumnVector interface for vectorized reads. Arrow has no byte-width buffer accessor mapped for getByte in this adapter, so it is intentionally unimplemented and throws UnsupportedOperationException — Spark columnar reads never use byte-level accessors for Iceberg data.","triggerScenarios":"Custom code (or a Spark internal path) calling getByte on an IcebergArrowColumnVector during a vectorized read. Standard Iceberg scans never trigger this; it appears only when a column accessor expects a ByteType-backed byte read directly from the Arrow-backed vector.","commonSituations":"Custom Spark TypeExtensions or third-party readers invoking the raw ColumnVector API; experimental Spark versions using byte accessors; user code extending the vectorized reader pipeline.","solutions":["Avoid calling getByte on IcebergArrowColumnVector; read the value as int via getInt and narrow it","Disable vectorization: spark.sql.iceberg.vectorization.enabled=false so non-Arrow column vectors are used","Upgrade Iceberg in case a newer release added byte accessor support","Cast the column to a wider type (e.g. IntegerType) in the query so byte access is not requested"],"exampleFix":"// before: custom accessor\nbyte b = vector.getByte(rowId); // throws\n// after:\nint v = vector.getInt(rowId); byte b = (byte) v; // or disable vectorization","handlingStrategy":"type-guard","validationCode":"// Only call supported accessors on IcebergArrowColumnVector: getBoolean/getInt/getLong/getFloat/getDouble/getDecimal/getArray/getMap\nboolean byteSafe(org.apache.spark.sql.vectorized.ColumnVector v) {\n  return !(v instanceof org.apache.iceberg.spark.data.vectorized.IcebergArrowColumnVector);\n}","typeGuard":"if (v instanceof org.apache.iceberg.spark.data.vectorized.IcebergArrowColumnVector) {\n  int i = v.getInt(rowId); // never call getByte on Arrow-backed vectors\n  byte b = (byte) i;\n} else {\n  byte b = v.getByte(rowId);\n}","tryCatchPattern":null,"preventionTips":["Never call getByte/getShort on IcebergArrowColumnVector — use getInt and narrow","Cast ByteType columns to IntegerType in queries over vectorized scans","Keep custom columnar code within the supported accessor set of the adapter"],"tags":["spark","vectorized-read","arrow","columnar"],"backgroundTag":"method-not-implemented","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"}