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
- Change the field metadata to a numeric type (TYPE_BIGNUMBER/TYPE_NUMBER/TYPE_INTEGER) at the producing step
- Unwrap/convert the Serializable object yourself to BigDecimal before calling getBigNumber
- 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
- Avoid stashing POJOs in rows that later flow through generic numeric logic
- Document field types in step metadata so consumers know what to expect
- Retype fields explicitly (Select Values / Metadata step) before numeric consumption
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
- : I don't know how to convert binary values to BigDecimals.
- Error converting data while looking up value
- : I don't know how to convert a binary value to Internet…
- : I don't know how to convert a binary value to timestamp.
- : I don't know how to convert a boolean to a Internet…
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)