pentaho/pentaho-kettle · error · KettleValueException

: I don't know how to convert serializable values to…

Error message

 : I don't know how to convert serializable values to BigDecimals.

What it means

ValueMetaBase.getBigNumber() cannot convert TYPE_SERIALIZABLE values (arbitrary Java objects stored in a row) to BigDecimal. Because no meaningful numeric interpretation exists, it throws KettleValueException. The field's declared type does not match what the consuming code expects.

Solutions

  1. Change the field metadata to a numeric type (TYPE_BIGNUMBER/TYPE_NUMBER/TYPE_INTEGER) at the producing step
  2. Unwrap/convert the Serializable object yourself to BigDecimal before calling getBigNumber
  3. Add an upfront type check with getValueMeta().getType() != TYPE_SERIALIZABLE before numeric access

Example fix

// before
Object raw = row[i]; // serializable POJO holding a numeric
BigDecimal v = valueMeta.getBigNumber(raw); // throws
// after
Object raw = row[i];
BigDecimal v = raw instanceof BigDecimal ? (BigDecimal) raw : new BigDecimal(String.valueOf(extractNumber(raw)));
Defensive patterns

Strategy: validation

Validate before calling

if (meta.getType() == ValueMetaInterface.TYPE_SERIALIZABLE) {
  throw new IllegalArgumentException("Field '" + meta.getName() + "' is SERIALIZABLE; convert to BigDecimal explicitly first");
}
BigDecimal v = meta.getBigNumber(value);

Type guard

boolean isSerializable(ValueMetaInterface m) {
  return m.getType() == ValueMetaInterface.TYPE_SERIALIZABLE;
}

Try / catch

try {
  BigDecimal v = meta.getBigNumber(value);
} catch (KettleValueException e) {
  Object raw = value;
  BigDecimal v = extractBigDecimal(raw); // custom unwrap for POJOs
}

Prevention

When it happens

Trigger: Calling getBigNumber(object) on a ValueMeta with type TYPE_SERIALIZABLE — typically data produced by custom steps, Kettle streaming serialization, or objects passed through via Serializable storage.

Common situations: Custom plugin steps stash POJOs in rows; after a refactor or plugin version change a previously numeric field comes back as Serializable; generic row-copying logic assumes all values are numeric.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/6df96d3668b7aa64. Report an issue: GitHub.

Appendix: source

Thrown at core/src/main/java/org/pentaho/di/core/row/value/ValueMetaBase.java:2217

              return convertDateToBigNumber( (Date) index[( (Integer) object ).intValue()] );
            default:
              throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." );
          }
        case TYPE_BOOLEAN:
          switch ( storageType ) {
            case STORAGE_TYPE_NORMAL:
              return convertBooleanToBigNumber( (Boolean) object );
            case STORAGE_TYPE_BINARY_STRING:
              return convertBooleanToBigNumber( (Boolean) convertBinaryStringToNativeType( (byte[]) object ) );
            case STORAGE_TYPE_INDEXED:
              return convertBooleanToBigNumber( (Boolean) index[( (Integer) object ).intValue()] );
            default:
              throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." );
          }
        case TYPE_BINARY:
          throw new KettleValueException( toString() + " : I don't know how to convert binary values to BigDecimals." );
        case TYPE_SERIALIZABLE:
          throw new KettleValueException( toString() + " : I don't know how to convert serializable values to BigDecimals." );
        default:
          throw new KettleValueException( toString() + " : Unknown type " + type + " specified." );
      }
    } catch ( Exception e ) {
      throw new KettleValueException( "Unexpected conversion error while converting value [" + toString()
          + "] to a BigNumber", e );
    }
  }

  @Override
  public Boolean getBoolean( Object object ) throws KettleValueException {
    if ( object == null ) {
      return null;
    }
    switch ( type ) {
      case TYPE_BOOLEAN:
        switch ( storageType ) {
          case STORAGE_TYPE_NORMAL:

View on GitHub (pinned to f3058517a1)