ну, запрошенные поля в виде StructType передаются в ридер, ридер читает их, руководствуясь смещениями из метаданных. Честно сказать, не увидел, где именно берётся numberOfRows из метаданных, но колонки точно фильтруются, а значит количество должно быть известно до прочтения конкретной колонки