pentaho/pentaho-kettle · error · KettleException
Number of levels must be greater that 0 to process the rows
Error message
Number of levels must be greater that 0 to process the rows
What it means
KettleException thrown in PaloDimOutput.processRow during the first-row analysis when the step has no dimension levels configured. The step maps incoming row fields onto Palo dimension levels, so zero configured levels makes processing impossible and the transformation aborts.
Solutions
- Open the Palo Dim Output step dialog and define at least one dimension level (dimension, level, field mapping).
- Re-save the transformation to persist the levels.
- If levels were configured but not loaded, check for related XML/repository load errors and fix the source file/attributes.
Example fix
// before: step run with empty levels table // after: in the dialog add e.g. Dimension 'Year', Level 'Year', Field 'yearField'
Defensive patterns
Strategy: validation
Validate before calling
// Before executing the transformation, assert levels are configured
PaloDimOutputMeta meta = (PaloDimOutputMeta) stepMeta.getStepMetaInterface();
if (meta.getLevels() == null || meta.getLevels().isEmpty()) {
throw new IllegalStateException("Palo Dim Output step has no levels configured");
} Type guard
boolean hasLevels(PaloDimOutputMeta meta) {
return meta != null && meta.getLevels() != null && !meta.getLevels().isEmpty();
} Try / catch
try {
trans.execute(null);
} catch (KettleException e) {
if (e.getMessage().contains("Number of levels must be greater")) {
log.error("Configure dimension levels in the Palo Dim Output dialog");
}
} Prevention
- Configure at least one level mapping before running the step
- Verify level attributes loaded correctly after migrations
- Preview the step in Spoon to catch empty config early
- Keep level definitions in version control via saved .ktr
When it happens
Trigger: The Palo Dim Output step's levels list is empty (meta.getLevels().size() == 0) when the first row arrives: the user never added level mappings in the dialog, or the saved level definitions failed to load (see related readRep/readData errors).
Common situations: Freshly added Palo Dim Output step run without configuring levels; transformation XML/repository attributes for levels lost during migration; step copied from another transformation without its level table.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- A connection of type PALO is expected
- There is no Palo database server connection defined
- A connection of type PALO is expected
- A server socket allocation always has to accompanied by…
- DimensionLookupMeta.Error.NoTechnicalKeySpecified
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/6489eba080b30511.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/dimoutput/PaloDimOutput.java:58
private ConsolidationCollection consolidations;
public PaloDimOutput( final StepMeta stepMeta, final StepDataInterface stepDataInterface, final int copyNr,
final TransMeta transMeta, final Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
public final boolean processRow( final StepMetaInterface smi, final StepDataInterface sdi ) throws KettleException {
meta = (PaloDimOutputMeta) smi;
data = (PaloDimOutputData) sdi;
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 */View on GitHub (pinned to f3058517a1)