pentaho/pentaho-kettle · error · KettleException
PropertyOutputMeta.Log.FileNameEmty
Error message
PropertyOutputMeta.Log.FileNameEmty
What it means
Thrown in processRow when the step is configured with 'filename in field': the filename is read from the configured input row field, and if that field's string value is empty for the current row, the step cannot open a target file and throws this KettleException. Unlike error 1745 the filename source is the row data, not the static metadata setting.
Solutions
- Fix the upstream step so the filename field is populated for every row (e.g. coalesce with a default path).
- Check the 'filename field' selection in the step settings points at the correct column.
- Filter out rows with null/empty filename before the Property Output step using a Filter rows step.
- Catch KettleException in the transformation executor and log the offending row's field values to locate the bad data.
Example fix
// before (upstream JavaScript/UDF) var outFile = row.filename; // after var outFile = (row.filename != null && row.filename.length > 0) ? row.filename : "/data/default.properties";
Defensive patterns
Strategy: validation
Validate before calling
// before feeding rows to Property Output (filter step / UDF)
if (filename == null || filename.trim().isEmpty()) {
// route row to an error stream or substitute a default path
} Try / catch
try {
trans.execute(null);
trans.waitUntilFinished();
} catch (KettleException e) {
if (e.getMessage().contains("FileNameEmty")) {
// inspect upstream data for null/empty filename field
}
} Prevention
- Add a Filter rows step to remove or default rows with empty filename before the step.
- Double-check the 'filename field' dropdown selection after editing upstream step mappings.
- Use a coalesce/default expression upstream so every row has a target path.
When it happens
Trigger: meta.isFileNameInField() is true and data.inputRowMeta.getString(r, data.indexOfFieldfilename) returns null/empty for a row — i.e. the filename field is missing, null, or contains "" in the incoming row.
Common situations: Upstream step emits null or empty values in the filename column; wrong field selected in the 'filename field' dropdown; a filtered/optional row stream where some rows legitimately have no file target.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- PropertyOutput.Log.FilenameEmpty
- Bounds of this rule are not numeric: lowerBound=
- ConnectionFileObject.PVFSRoot.UnsupportedOperation
- ConnectionFileObject.UndefinedConnection
- Could not convert to the given local format.
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/81ff63f4d8c4b1b6.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/propertyoutput/PropertyOutput.java:120
data.filename = buildFilename();
// Check if filename is empty..
if ( Utils.isEmpty( data.filename ) ) {
logError( BaseMessages.getString( PKG, "PropertyOutput.Log.FilenameEmpty" ) );
throw new KettleException( BaseMessages.getString( PKG, "PropertyOutput.Log.FilenameEmpty" ) );
}
openNewFile();
}
} // end first
// Get value field
String propkey = data.inputRowMeta.getString( r, data.indexOfKeyField );
String propvalue = data.inputRowMeta.getString( r, data.indexOfValueField );
try {
if ( meta.isFileNameInField() ) {
data.filename = data.inputRowMeta.getString( r, data.indexOfFieldfilename );
if ( Utils.isEmpty( data.filename ) ) {
throw new KettleException( BaseMessages.getString( PKG, "PropertyOutputMeta.Log.FileNameEmty" ) );
}
if ( !checkSameFile() ) {
// close previous file
closeFile();
// Open new file
openNewFile();
}
}
if ( !data.KeySet.contains( propkey ) ) {
if ( log.isDetailed() ) {
logDetailed( BaseMessages.getString( PKG, "PropertyOutput.Log.Key", propkey ) );
logDetailed( BaseMessages.getString( PKG, "PropertyOutput.Log.Value", propvalue ) );
}
// Update property
data.pro.setProperty( propkey, propvalue );
putRow( data.outputRowMeta, r ); // in case we want it to go further...
incrementLinesOutput();View on GitHub (pinned to f3058517a1)