{"record":{"id":"50b3f0881a645b94","repo":"apache/flink","slug":"only-support-seek-at-first","errorCode":null,"errorMessage":"Only support seek at first.","messagePattern":"Only support seek at first\\.","errorType":"validation","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink-formats/flink-parquet/src/main/java/org/apache/flink/formats/parquet/ParquetVectorizedInputFormat.java","lineNumber":451,"sourceCode":"            for (int i = 0; i < types.size(); ++i) {\n                if (!unknownFieldsIndices.contains(i)) {\n                    columnReaders[i] =\n                            createColumnReader(\n                                    isUtcTimestamp,\n                                    projectedTypes[i],\n                                    types.get(i),\n                                    requestedSchema.getColumns(),\n                                    pages,\n                                    fields.get(i),\n                                    0);\n                }\n            }\n            totalCountLoadedSoFar += pages.getRowCount();\n        }\n\n        public void seek(long rowCount) {\n            if (totalCountLoadedSoFar != 0) {\n                throw new UnsupportedOperationException(\"Only support seek at first.\");\n            }\n\n            List<BlockMetaData> blockMetaData = reader.getRowGroups();\n\n            for (BlockMetaData metaData : blockMetaData) {\n                if (metaData.getRowCount() > rowCount) {\n                    break;\n                } else {\n                    reader.skipNextRowGroup();\n                    rowsReturned += metaData.getRowCount();\n                    totalCountLoadedSoFar += metaData.getRowCount();\n                    rowCount -= metaData.getRowCount();\n                }\n            }\n\n            this.recordsToSkip = rowCount;\n        }\n","sourceCodeStart":433,"sourceCodeEnd":469,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-formats/flink-parquet/src/main/java/org/apache/flink/formats/parquet/ParquetVectorizedInputFormat.java#L433-L469","documentation":"ParquetVectorizedInputFormat's seek() only supports seeking before any rows have been read (totalCountLoadedSoFar must be 0). The reader pre-loads row groups into memory, so a re-seek after reading has started is impossible without discarding loaded state. Flink throws UnsupportedOperationException to make this contract explicit.","triggerScenarios":"Calling reader.seek(rowCount) on a ParquetVectorizedInputFormat.Reader a second time, or calling seek() after nextBatch()/readRecords() has already loaded at least one row group (totalCountLoadedSoFar != 0).","commonSituations":"Batch readers that reposition for a retry, checkpoint restore that re-seeks a partially consumed split, or custom split enumeration logic that seeks mid-stream instead of creating a fresh reader per split.","solutions":["Create a new reader instance for each seek position instead of re-seeking an existing one","Ensure seek() is the first call after construction, before any batch read","If re-positioning is required, use the recordsToSkip mechanism at reader creation or the skip support in the file source splits"],"exampleFix":"// before\nreader.nextBatch(); // loads a row group\nreader.seek(1000);   // throws\n\n// after\n// finish or discard the reader, then:\nParquetVectorizedInputFormat.Reader<T> fresh = format.createReader(config);\nfresh.seek(1000);","handlingStrategy":"validation","validationCode":"// seek only on a fresh reader\nif (!reader.isCompleted() && !anyBatchRead) { /* track first-read yourself */ }\n// simplest: always seek exactly once, immediately after creating the reader","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Create one reader per split/seek position; never reuse readers across seeks","Call seek() immediately after createReader, before any nextBatch/readRecords","Wrap reader lifecycle so cancellation closes it instead of re-seeking"],"tags":["parquet","seek","streaming","flink"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}