apache/iceberg · error · UnsupportedOperationException

Unsupported type: double

Error message

Unsupported type: double

What it means

The base ArrowVectorAccessor.getDouble(int) is an unimplemented stub that always throws. Double (float8) accessors must override it; calling the base means the accessor instance cannot read doubles. toFloat8Vector in the vectorized read path depends on the override.

Source

Thrown at arrow/src/main/java/org/apache/iceberg/arrow/vectorized/ArrowVectorAccessor.java:69

  public boolean getBoolean(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: boolean");
  }

  public int getInt(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: int");
  }

  public long getLong(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: long");
  }

  public float getFloat(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: float");
  }

  public double getDouble(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: double");
  }

  public byte[] getBinary(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: binary");
  }

  public DecimalT getDecimal(int rowId, int precision, int scale) {
    throw new UnsupportedOperationException("Unsupported type: decimal");
  }

  public Utf8StringT getUTF8String(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: UTF8String");
  }

  public ArrayT getArray(int rowId) {
    throw new UnsupportedOperationException("Unsupported type: array");
  }

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Dispatch Float8Vector to an accessor overriding getDouble (return vector.get(rowId)).
  2. Add the @Override getDouble to your subclass.
  3. Fall back to non-vectorized reads if accessor wiring cannot be fixed immediately.

Example fix

// before
class MyAccessor extends ArrowVectorAccessor<Float8Vector> { } // getDouble missing
// after
@Override public double getDouble(int rowId) { return vector.get(rowId); }
Defensive patterns

Strategy: type-guard

Validate before calling

if (!(accessor instanceof DoubleAccessor)) { /* fallback */ }

Type guard

static boolean supportsDouble(ArrowVectorAccessor<?> a) {
  return a.getClass() != ArrowVectorAccessor.class;
}

Try / catch

try {
  double v = accessor.getDouble(rowId);
} catch (UnsupportedOperationException e) {
  if ("Unsupported type: double".equals(e.getMessage())) { fallbackRead(rowId); } else { throw e; }
}

Prevention

When it happens

Trigger: Reading a double column via an accessor that lacks the getDouble override — mis-mapped vector type in the accessor factory or base-class instantiation.

Common situations: Custom vectorized readers converting to engine double vectors; subclasses authored without a double override; new Arrow double vector types not routed correctly.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/aa4a9b200ca5734e. Report an issue: GitHub.