apache/iceberg · error · IllegalArgumentException

Cannot convert dict encoded field '%s' of type '%s' to Arrow

Error message

Cannot convert dict encoded field '%s' of type '%s' to Arrow vector as it is currently not supported

What it means

DictEncodedArrowConverter.toArrowVector only supports dictionary-encoded fields of INT, LONG, FLOAT, DOUBLE, BINARY, and TIME Iceberg types. Any other dict-encoded type reaching the converter throws this IllegalArgumentException naming the field and type ID.

Source

Thrown at arrow/src/main/java/org/apache/iceberg/arrow/DictEncodedArrowConverter.java:77

      } else if (Type.TypeID.TIMESTAMP.equals(vectorHolder.icebergType().typeId())) {
        return toTimestampVector(vectorHolder, accessor);
      } else if (Type.TypeID.TIMESTAMP_NANO.equals(vectorHolder.icebergType().typeId())) {
        return toTimestampNanoVector(vectorHolder, accessor);
      } else if (Type.TypeID.LONG.equals(vectorHolder.icebergType().typeId())) {
        return toBigIntVector(vectorHolder, accessor);
      } else if (Type.TypeID.FLOAT.equals(vectorHolder.icebergType().typeId())) {
        return toFloat4Vector(vectorHolder, accessor);
      } else if (Type.TypeID.DOUBLE.equals(vectorHolder.icebergType().typeId())) {
        return toFloat8Vector(vectorHolder, accessor);
      } else if (Type.TypeID.STRING.equals(vectorHolder.icebergType().typeId())) {
        return toVarCharVector(vectorHolder, accessor);
      } else if (Type.TypeID.BINARY.equals(vectorHolder.icebergType().typeId())) {
        return toVarBinaryVector(vectorHolder, accessor);
      } else if (Type.TypeID.TIME.equals(vectorHolder.icebergType().typeId())) {
        return toTimeMicroVector(vectorHolder, accessor);
      }

      throw new IllegalArgumentException(
          String.format(
              "Cannot convert dict encoded field '%s' of type '%s' to Arrow "
                  + "vector as it is currently not supported",
              vectorHolder.icebergField().name(), vectorHolder.icebergType().typeId()));
    }

    return vectorHolder.vector();
  }

  private static DecimalVector toDecimalVector(
      VectorHolder vectorHolder, ArrowVectorAccessor<?, String, ?, ?> accessor) {
    int precision = ((Types.DecimalType) vectorHolder.icebergType()).precision();
    int scale = ((Types.DecimalType) vectorHolder.icebergType()).scale();

    DecimalVector vector =
        new DecimalVector(
            vectorHolder.vector().getName(),
            ArrowSchemaUtil.convert(vectorHolder.icebergField()).getFieldType(),

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Disable dictionary encoding for that column or rewrite the data so the column uses a supported encoding.
  2. Disable vectorized/Arrow reads for the scan (fall back to the non-vectorized path).
  3. Filter or project out the unsupported column in the scan schema.
Defensive patterns

Strategy: validation

Validate before calling

Set<Type.TypeID> supported = Set.of(Type.TypeID.INT, Type.TypeID.LONG, Type.TypeID.FLOAT, Type.TypeID.DOUBLE, Type.TypeID.BINARY, Type.TypeID.TIME);

Type guard

static boolean isDictDecodable(Types.NestedField f) { return Set.of(Type.TypeID.INT, Type.TypeID.LONG, Type.TypeID.FLOAT, Type.TypeID.DOUBLE, Type.TypeID.BINARY, Type.TypeID.TIME).contains(f.type().typeId()); }

Try / catch

try { return toArrowVector(holder, accessor); } catch (IllegalArgumentException e) { /* fall back to non-dict-encoded read path */ }

Prevention

When it happens

Trigger: Reading a data file whose dictionary-encoded column has an Iceberg type outside the supported set (e.g. dict-encoded DATE, TIMESTAMP, or DECIMAL) via the vectorized Arrow read path.

Common situations: Parquet files written by other engines with dictionary encoding on unusual column types; enabling vectorized reads on such data.

Related errors


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