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
- Open the partitioning step settings and set the partitioning field to a column that exists in that step's output row
- Inspect the row metadata in the error message to see the actual available field names and correct the spelling/case
- 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
- Preview upstream steps to confirm the partition field exists in the output row
- Re-verify partitioner settings after renaming fields
- Use repository search to find steps referencing a renamed field
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
- AnalyticQueryMeta.Exception.SubjectFieldNotFound
- BaseStep.SafeMode.Exception.DoubleFieldnames
- BaseStep.SafeMode.Exception.MixingLayout
- BaseStep.SafeMode.Exception.MixingStorageTypes
- BaseStep.SafeMode.Exception.MixingTypes
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)