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

  1. Re-select the update stream fields in the dialog from the actual input field list
  2. Insert/repair an upstream Select values rename so the expected names exist
  3. Preview the previous step and align the mapping grid with the real field names
  4. 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

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


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)