pentaho/pentaho-kettle · error · KettleStepException

Unable to find partitioning field name

Error message

Unable to find partitioning field name [${fieldName}] in the output row...${rowMeta}

What it means

ModPartitioner partitions rows across step copies by hashing a chosen field's value. During the first getPartition() call it initializes by looking up the configured field name in the incoming row metadata; if the field does not exist in the row, it throws this KettleStepException. The row metadata is appended to the message to help diagnose which fields are actually available.

Solutions

  1. Open the partitioning step settings and set the partitioning field to a column that exists in that step's output row
  2. Inspect the row metadata in the error message to see the actual available field names and correct the spelling/case
  3. Re-run a preview of the preceding step to confirm the field is produced before the partitioning step

Example fix

// before (partitioner config references removed field)
partitioner.setFieldName("oldAmount");
// after
partitioner.setFieldName("amount"); // must match output row field
Defensive patterns

Strategy: validation

Validate before calling

int idx = rowMeta.indexOfValue(fieldName);
if (idx < 0) {
  throw new IllegalArgumentException("Field '" + fieldName + "' not in row; available: " + rowMeta.getFieldNames());
}

Type guard

boolean hasField = rowMeta.indexOfValue(fieldName) >= 0;

Try / catch

try { partitioner.getPartition(rowMeta, row); } catch (KettleStepException e) { log.error("Partition field missing: " + e.getMessage()); }

Prevention

When it happens

Trigger: The partitioning step is configured with a field name (fieldName) that is not present in the output row metadata at runtime — e.g. the field was renamed, removed by a preceding step, or the partitioner field was set on the wrong step whose output schema differs.

Common situations: Renaming a field upstream after configuring the partitioner; using a partition field produced in a later step; case-sensitive field name mismatch; copying transformations between environments where step definitions drifted.

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/889f3df1c0bafdd8. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/ModPartitioner.java:61

  public ModPartitioner clone() {
    ModPartitioner modPartitioner = (ModPartitioner) super.clone();
    modPartitioner.fieldName = fieldName;

    return modPartitioner;
  }

  public String getDialogClassName() {
    return "org.pentaho.di.ui.trans.dialog.ModPartitionerDialog";
  }

  public int getPartition( RowMetaInterface rowMeta, Object[] row ) throws KettleException {
    init( rowMeta );

    if ( partitionColumnIndex < 0 ) {
      partitionColumnIndex = rowMeta.indexOfValue( fieldName );
      if ( partitionColumnIndex < 0 ) {
        throw new KettleStepException( "Unable to find partitioning field name ["
          + fieldName + "] in the output row..." + rowMeta );
      }
    }

    long value;

    ValueMetaInterface valueMeta = rowMeta.getValueMeta( partitionColumnIndex );
    Object valueData = row[partitionColumnIndex];

    switch ( valueMeta.getType() ) {
      case ValueMetaInterface.TYPE_INTEGER:
        Long longValue = rowMeta.getInteger( row, partitionColumnIndex );
        if ( longValue == null ) {
          value = valueMeta.hashCode( valueData );
        } else {
          value = longValue.longValue();
        }
        break;

View on GitHub (pinned to f3058517a1)