pentaho/pentaho-kettle · error · KettleException

DimOutput: failed to find input row meta for

Error message

DimOutput: failed to find input row meta for 

What it means

PaloDimOutput.processRow iterates the configured dimension levels and resolves each level's data field name to a column index in the incoming row via getInputRowMeta().indexOfValue(). If the level's field name is not a column of the input row (index < 0), the step cannot populate data.indexes and throws this KettleException. It is a step-configuration vs. upstream-row-layout mismatch.

Solutions

  1. Open the Palo DimOutput step dialog and re-select the field for every level so it matches an actual incoming column
  2. Check the preceding step's output fields (right-click > Show output fields) and rename/restore the missing column there
  3. Ensure the step actually receives rows from an upstream hop with the expected fields
  4. Use a 'Select values' / 'Field exists' repair step to guarantee column names before this step

Example fix

// before (stream lacks column 'LevelName')
levels: [{ levelName: 'Year', fieldName: 'LevelName' }]
// after
levels: [{ levelName: 'Year', fieldName: 'year_field' }] // matches an existing input column
Defensive patterns

Strategy: validation

Validate before calling

for (PaloDimensionLevel lvl : meta.getLevels()) {
  if (inputRowMeta.indexOfValue(lvl.getFieldName()) < 0) {
    throw new KettleException("Level '" + lvl.getLevelName() + "' field '" + lvl.getFieldName() + "' not in input row");
  }
}

Type guard

boolean hasField(RowMetaInterface row, String name) { return name != null && row.indexOfValue(name) >= 0; }

Try / catch

try { processStep(); } catch (KettleException e) { logError("Missing input field for level: " + e.getMessage(), e); setErrors(1); }

Prevention

When it happens

Trigger: A level in the Palo DimOutput step dialog references a fieldName that does not exist in the row arriving at the step (renamed/deleted upstream column, wrong step order, no fields mapped).

Common situations: Upstream step renamed a field after configuring this step; copying a transformation between environments where field casing differs; running the step with no prior step producing rows with those columns.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/dimoutput/PaloDimOutput.java:70

    Object[] r = getRow();

    if ( first ) {
      first = false;
      this.logBasic( "First Row Analysis:" );
      if ( meta.getLevels().size() == 0 ) {
        throw new KettleException( "Number of levels must be greater that 0 to process the rows" );
      }
      this.logBasic( "Number of defined levels: " + meta.getLevels().size() );

      /* Indexes will follow [data index],[consolidation index],[data index],[consolidation index] .... */
      data.indexes = new int[meta.getLevels().size() * 2];
      for ( int i = 0; i < meta.getLevels().size(); i++ ) {

        /* Get data field index */
        String dataFieldName = meta.getLevels().get( i ).getFieldName();
        int numRow = getInputRowMeta().indexOfValue( dataFieldName );
        if ( numRow < 0 ) {
          throw new KettleException( "DimOutput: failed to find input row meta for ".concat( meta.getLevels().get( i )
            .getLevelName() ) );
        }
        data.indexes[i * 2] = numRow;
        this.logDebug( meta.getLevels().get( i ).getLevelName() + " has index: " + numRow );

        /* Get consolidation field index */
        String consolidationFieldName = meta.getLevels().get( i ).getConsolidationFieldName();
        if ( consolidationFieldName == null ) {
          numRow = -1;
          this.logDebug( "Consolidation factor was left to the default" );
        } else {
          numRow = getInputRowMeta().indexOfValue( consolidationFieldName );
          if ( numRow < 0 ) {
            throw new KettleException( "DimOutput: failed to find input row meta for ".concat( meta.getLevels().get( i )
              .getConsolidationFieldName() ) );
          }
          this.logDebug( meta.getLevels().get( i ).getConsolidationFieldName() + " has index: " + numRow );
        }

View on GitHub (pinned to f3058517a1)