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

  1. Copy the gzip file to a local filesystem path and point the step at it
  2. Use a local path (file://... or plain absolute path) instead of a remote URI
  3. Pre-download remote files with a prior job/step before the ParGzipCsvInput step
  4. 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

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


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)