Что делает этот конвертер
Apache Parquet — формат, который сегодня пишет почти любой конвейер данных: колоночный, сжатый, двоичный, рассчитанный на аналитические движки. Машине он удобен, человеческому глазу бесполезен. Его не открыть в текстовом редакторе, не отправить коллеге, который живёт в таблицах, не вставить в тикет. CSV — полная противоположность: неуклюжий для аналитики и читаемый везде.
Эта страница соединяет две стороны максимально прямо. Вы выбираете файл .parquet на диске, страница его разбирает, сообщает, сколько нашла строк и столбцов, показывает предпросмотр и отдаёт CSV на скачивание. Ни аккаунта, ни очереди, ни полосы загрузки — потому что сервера в этой цепочке нет вообще.
Именно ради этого инструмент и сделан. Большинство онлайн-конвертеров Parquet — это форма, которая отправляет ваш файл на бэкенд. Если в файле лежат данные клиентов, зарплаты, медицинские идентификаторы или что угодно ещё под действием политики обработки данных, отправка и есть главная проблема. Здесь преобразование — это JavaScript, работающий в вашей вкладке и читающий байты, которые браузер уже передал странице в момент выбора файла.
Как пользоваться: четыре шага
- Выберите файл
.parquetв поле выбора. До этого ничего не происходит. - Выберите разделитель. По умолчанию запятая; точка с запятой подходит для таблиц в локалях, где запятая служит десятичным знаком, — это как раз русская раскладка Excel; табуляция даёт TSV, который аккуратно вставляется почти в любой табличный редактор.
- Решите, нужна ли строка с названиями столбцов. Флажок заголовка включён по умолчанию, и его переключение мгновенно перестраивает результат без повторного чтения файла.
- Просмотрите предпросмотр и нажмите Скачать CSV. В предпросмотре показаны первые 200 строк, чтобы страница оставалась отзывчивой; в скачанном файле всегда все строки исходного Parquet.
Смена разделителя или заголовка после конвертации не читает диск заново. Разобранная таблица хранится в памяти вкладки, поэтому переключения мгновенны даже на сотнях тысяч строк.
Как Parquet хранит таблицу и почему конвертация нетривиальна
CSV — это поток строк. Parquet устроен наоборот: он хранит каждый столбец отдельно, в блоках row group, а внутри row group столбец лежит в чанке из страниц. Каждая страница может быть сжата, а значения внутри — закодированы несколькими разными способами.
Поэтому чтение означает разворачивание нескольких слоёв:
- Футер хранит схему и расположение каждого чанка, сериализованные компактным протоколом Thrift. Файл заканчивается четырьмя байтами длины и ASCII-маркером
PAR1, который стоит и в самом начале файла. Если маркера нет, это либо не Parquet, либо файл обрезали при копировании. - Каждая страница может быть сжата. Инструмент разбирает несжатые страницы, Snappy и Gzip — вместе они покрывают подавляющее большинство файлов, записанных pandas, PyArrow, Polars, DuckDB и Spark.
- Значения внутри страницы закодированы. Плоская укладка, словарное кодирование, run-length, семейство delta и byte-stream-split поддерживаются все, как в data page v1, так и в более новом варианте v2.
- Пустые значения не хранятся как значения. Parquet записывает уровень определения на каждую строку, и конвертер по этим уровням возвращает значения в нужные строки, а на местах пропусков оставляет пустоту.
Пока всё работает, эти детали не важны. Они важны, когда что-то не работает: раз декодер понимает каждый слой, неподдерживаемый файл даёт конкретное сообщение о сжатии, кодировке или вложенности, а не тихо испорченный CSV.
Разобранный пример: какие значения вы увидите
У трёх типов Parquet нет прямого аналога в CSV, поэтому стоит знать, что именно записывается.
Столбец с датой. Тип DATE хранит обычный 32-битный счётчик дней с 1 января 1970 года. Если записано число 19723, то 19723 дня после эпохи — это 1 января 2024 года, и в ячейке CSV окажется 2024-01-01. Никакой часовой пояс не применяется: у даты нет времени, которое можно было бы сдвинуть.
Метка времени в микросекундах. Столбец TIMESTAMP с микросекундной точностью хранит 64-битный счётчик микросекунд с эпохи. Возьмём значение 1704112215123456. Делим на 1 000 000 — получаем 1704112215 целых секунд, то есть 1 января 2024 года 12:30:15 UTC, и остаётся 123456 микросекунд. В ячейке будет 2024-01-01 12:30:15.123456. Нули в конце дробной части отбрасываются, поэтому метка, попавшая ровно в секунду, пишется без десятичной части.
Столбец decimal. Столбец DECIMAL(12,2) хранится как целое число плюс масштаб. Целое 1230 с масштабом 2 означает 12,30 и записывается буквально как 12.30. Именно поэтому финансовый столбец нельзя прогонять через число с плавающей точкой: текст сохраняет и точное значение, и точное количество знаков, обещанное схемой.
Логические значения пишутся как true и false, пустые значения превращаются в пустые поля, а двоичные столбцы, не являющиеся корректным UTF-8, записываются в base64, чтобы сырые байты не сломали структуру CSV.
Где офлайновый конвертер действительно нужен
Очевидный случай — конфиденциальность: выгрузка пользовательских записей, которую нужно быстро просмотреть до того, как она окажется рядом с общим диском. Ничего не покидает ноутбук, значит, ни одно правило не нарушено.
Второй случай — трение. Коллега прислал выгрузку в Parquet, вам нужно проверить три столбца, а ставить Python вместе с PyArrow ради файла, который вы удалите через пять минут, — абсурдная цена. Открыть вкладку — нет.
Третий случай — машина, которую вы не вправе настраивать: закрытый корпоративный ноутбук, компьютер клиента, лабораторный стенд без установки пакетов. Браузер там уже есть.
Четвёртый случай — обучение. Когда одна и та же таблица сначала выглядит непрозрачным двоичным куском, а потом простым текстом, разница между колоночным и построчным хранением становится осязаемой так, как редко удаётся схеме.
Частые ошибки и как их избежать
CSV открывается в редакторе таблиц одним огромным столбцом. Программа ждёт разделитель своей локали. Сформируйте файл заново с точкой с запятой или воспользуйтесь диалогом импорта и укажите разделитель явно.
Длинные числовые идентификаторы превращаются в экспоненциальную запись. Это поведение табличного редактора, а не CSV. В файле лежат цифры; программа решила показать их как число с плавающей точкой. Импортируйте столбец как текст.
Ожидание местного времени. Метки времени пишутся в UTC. Parquet обычно хранит их как момент времени, и перевод в тот пояс, где случайно оказалась ваша машина, тихо изменил бы все значения. Если нужно местное время, сдвиньте их позже и осознанно.
Подача вложенной выгрузки. Файл со столбцами struct, list или map отклоняется. Сначала разверните вложенность через pandas.json_normalize, unnest в Polars или запрос DuckDB, выбирающий листовые поля, запишите плоский Parquet и конвертируйте его.
Ограничения: когда инструмент не подходит
Он читает файл целиком в память, поэтому очень крупные выгрузки — от нескольких сотен мегабайт — разумнее обрабатывать в DuckDB или скриптом, который проходит row group за row group. Сжатие Zstd, Brotli и LZ4 отклоняется, а не разбирается наполовину; перезапишите такие файлы со Snappy или Gzip. Зашифрованные файлы Parquet не поддерживаются осознанно. Вложенные схемы тоже вне области применения: свернуть столбец-список в одну ячейку CSV — это решение о ваших данных, которое универсальный конвертер не должен принимать молча.
Приватность
На странице нет кода загрузки, нет аналитики по вашему файлу и нет ни одного сетевого запроса во время конвертации. Файл читается штатным файловым API браузера и разбирается во вкладке. Если нужна проверка, а не обещание: загрузите страницу, отключите сеть и конвертируйте файл. Результат будет тем же, потому что на другом конце провода никогда никого не было.
Вопросы о конвертации Parquet в CSV
- Данные действительно никуда не отправляются?
- Именно так. Конвертер — это обычный JavaScript: он читает байты выбранного файла и разбирает их прямо на странице. Нет ни загрузки, ни обращений к API, ни аналитики по вашим данным. После загрузки страницы можно отключить сеть — инструмент продолжит работать, и это самый простой способ убедиться самому.
- Какие файлы Parquet поддерживаются?
- Плоские таблицы, записанные привычными инструментами: pandas, PyArrow, Polars, DuckDB, Spark. Разбираются страницы без сжатия, со Snappy и с Gzip, а также кодировки PLAIN, словарная, RLE, delta и byte-stream-split, в страницах данных v1 и v2. Zstd, Brotli, LZ4 и зашифрованные файлы отклоняются с понятным сообщением, а не дают неверный результат.
- Что происходит с вложенными столбцами?
- Они намеренно отклоняются. У столбца типа struct, list или map нет единственного очевидного вида в CSV, и молча выбрать один вариант значило бы испортить данные. Сначала разверните вложенность в pandas, Polars или DuckDB, запишите плоский Parquet, а потом конвертируйте его здесь.
- Как записываются даты, метки времени и decimal?
- Даты выводятся как ГГГГ-ММ-ДД. Метки времени выводятся как ГГГГ-ММ-ДД ЧЧ:ММ:СС в UTC с сохранением миллисекунд, микросекунд или наносекунд, если они есть в столбце. Столбцы decimal сохраняют точный масштаб в виде текста, поэтому 12.30 остаётся 12.30 и не превращается в округлённое число с плавающей точкой. Пустые значения становятся пустыми полями.