pentaho/pentaho-kettle · error · KettleException
ParGzipCsvInput.Log.OnlyLocalFilesAreSupported
ParGzipCsvInput.Log.OnlyLocalFilesAreSupported
Error message
ParGzipCsvInput.Log.OnlyLocalFilesAreSupported
What it means
Thrown in the ParGzipCsvInputDialog constructor when fetching header fields: the resolved input file is not a LocalFile. The step relies on java NIO and GZIPInputStream which only work on local files, so VFS objects of other kinds (remote/http/sftp) are rejected.
Solutions
- Copy the gzip file to a local filesystem path and point the step at it
- Use a local path (file://... or plain absolute path) instead of a remote URI
- Pre-download remote files with a prior job/step before the ParGzipCsvInput step
- Verify environment substitution does not rewrite the filename to a remote scheme
Example fix
// before String filename = "sftp://host/data/file.csv.gz"; // after String filename = "/data/local/file.csv.gz"; // local copy of the gzip file
Defensive patterns
Strategy: validation
Validate before calling
FileObject fo = KettleVFS.getInstance(bowl).getFileObject(envSubstitute(filename));
if (!(fo instanceof LocalFile)) throw new IllegalArgumentException("ParGzipCsvInput only supports local files: " + filename); Type guard
boolean isLocalFile(FileObject fo) { return fo instanceof LocalFile; } Try / catch
try { openDialog(); } catch (KettleException e) { log.error("Non-local file for ParGzipCsvInput: " + e.getMessage()); } Prevention
- Only point the step at local filesystem paths
- Pre-stage remote gzip files locally before this step
- Check environment substitution output for remote schemes
When it happens
Trigger: The gzip CSV filename resolves (after environment substitution) to a non-local VFS file, e.g. an http:, sftp:, or other remote file object, while the dialog tries to read its fields.
Common situations: Pointing the step at a URL or network file share via a non-local VFS provider, or an environment variable substitution resolving to a remote location.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Bounds of this rule are not numeric: lowerBound=
- ConnectionFileObject.PVFSRoot.UnsupportedOperation
- ConnectionFileObject.UndefinedConnection
- Error opening file [" + data.filename + "]!
- ExcelInputLog.ImageFileNotExists
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/065ad1293e7ca772.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/trans/steps/parallelgzipcsv/ParGzipCsvInputDialog.java:751
getInfo( inputMeta );
stepname = wStepname.getText();
dispose();
}
// Get the data layout
private void getCSV() {
InputStream inputStream = null;
try {
ParGzipCsvInputMeta meta = new ParGzipCsvInputMeta();
getInfo( meta );
String filename = transMeta.environmentSubstitute( meta.getFilename() );
FileObject fileObject = KettleVFS.getInstance( transMeta.getBowl() ).getFileObject( filename );
if ( !( fileObject instanceof LocalFile ) ) {
// We can only use NIO on local files at the moment, so that's what we limit ourselves to.
//
throw new KettleException( BaseMessages.getString( PKG, "ParGzipCsvInput.Log.OnlyLocalFilesAreSupported" ) );
}
wFields.table.removeAll();
inputStream = new GZIPInputStream( KettleVFS.getInputStream( fileObject ) );
InputStreamReader reader = new InputStreamReader( inputStream );
EncodingType encodingType = EncodingType.guessEncodingType( reader.getEncoding() );
// Read a line of data to determine the number of rows...
//
String line =
TextFileInput.getLine(
log, reader, encodingType, TextFileInputMeta.FILE_FORMAT_MIXED, new StringBuilder( 1000 ) );
// Split the string, header or data into parts...
//
String[] fieldNames = Const.splitString( line, meta.getDelimiter() );
View on GitHub (pinned to f3058517a1)