pentaho/pentaho-kettle · error · KettleStepException
Unable to find field
Error message
Unable to find field [<field>] in the input rows (updateStream)
What it means
Same validation path as 2287 but for the updateStream[i] fields: while assembling tableFields for the SQL/meta comparison, searchValueMeta(updateStream[i]) returned null and the step throws 'Unable to find field [x] in the input rows'. The update mapping references stream fields that the incoming rows do not contain.
Solutions
- Re-select the update stream fields in the dialog from the actual input field list
- Insert/repair an upstream Select values rename so the expected names exist
- Preview the previous step and align the mapping grid with the real field names
- Remove stale mapping rows for fields that no longer exist
Example fix
// before updateStream[2] = "qty" (renamed upstream to quantity) -> throw // after updateStream[2] = "quantity"
Defensive patterns
Strategy: validation
Validate before calling
var m = stepMeta.getStepMetaInterface();
var prev = transMeta.getPrevStepFields(stepMeta);
m.getUpdateStream().forEach(function(u) { if (u != null && prev.searchValueMeta(u) == null) throw new Error("Missing update stream field: " + u); }); Type guard
function fieldExists(rowMeta, name) { return name != null && rowMeta != null && rowMeta.searchValueMeta(name) != null; } Try / catch
try { stepMeta.getStepMetaInterface().getFields(prev, "tableFields", rowMetaInterfaces, stepMeta, metaStore, transMeta); }
catch (KettleStepException e) { log.error("Update stream mapping invalid: " + e.getMessage()); /* fix mapping */ } Prevention
- Remove stale mapping rows when upstream fields are deleted
- Re-pick update stream fields after schema changes
- Preview the previous step to see actual output fields
- Avoid manually typed field names
When it happens
Trigger: An 'Update stream' entry in the mapping grid points to a field absent from the previous step's output — schema drift, rename, or removal upstream; triggered during step metadata validation/getFields.
Common situations: Editing upstream steps after configuring the mapping; copying steps between transformations with different streams; case-sensitivity mismatches in field names.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Unable to find field
- StreamLookupMeta.Exception.ReturnValueCanNotBeFound
- At least one slave server is required to be present in…
- BaseStreamStepMeta.CheckResult.ResultStepMissing
- ChangeFileEncoding.Error.TargetFileIsEmpty
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/80705ecb493e3d25.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:928
tableField.setName( keyLookup[i] );
tableFields.addValueMeta( tableField );
} else {
throw new KettleStepException( "Unable to find field [" + keyStream[i] + "] in the input rows" );
}
}
}
// the lookup fields
for ( int i = 0; i < updateLookup.length; i++ ) {
ValueMetaInterface v = prev.searchValueMeta( updateStream[i] );
if ( v != null ) {
ValueMetaInterface vk = tableFields.searchValueMeta( updateStream[i] );
if ( vk == null ) { // do not add again when already added as key fields
ValueMetaInterface tableField = v.clone();
tableField.setName( updateLookup[i] );
tableFields.addValueMeta( tableField );
}
} else {
throw new KettleStepException( "Unable to find field [" + updateStream[i] + "] in the input rows" );
}
}
if ( !Utils.isEmpty( tableName ) ) {
Database db = new Database( loggingObject, databaseMeta );
try {
db.connect();
String schemaTable = databaseMeta.getQuotedSchemaTableCombination( schemaName, tableName );
String cr_table = db.getDDL( schemaTable, tableFields, null, false, null, true );
String cr_index = "";
String[] idx_fields = null;
if ( keyLookup != null && keyLookup.length > 0 ) {
idx_fields = new String[keyLookup.length];
for ( int i = 0; i < keyLookup.length; i++ ) {
idx_fields[i] = keyLookup[i];View on GitHub (pinned to f3058517a1)