Форматы данных: CSV, JSON, Parquet

Урок сравнивает три главных формата хранения данных и объясняет, почему аналитика выбирает Parquet.

Колоночный формат — данные хранятся по столбцам, а не по строкам, что ускоряет аналитические запросы и улучшает сжатие.

Три формата, три компромисса

CSV — простой текст, строки разделены переносами, поля — запятыми. Читается человеком и любой программой, но не хранит типы (всё строки) и не сжимается сам по себе.

JSON — текст с вложенной структурой. Отлично передаёт сложные объекты и массивы, но многословен: имена ключей повторяются в каждой записи.

Parquet — бинарный колоночный формат. Хранит типы, сильно сжимается и читает только нужные столбцы. Это стандарт де-факто для аналитики и data lake.

Построчно против поколоночно

Построчно (CSV):    [id,name,age][id,name,age][id,name,age]
Поколоночно (Parquet): [id id id][name name name][age age age]

Если запрос считает только средний возраст, колоночному формату нужно прочитать лишь блок age — остальные столбцы он пропускает. CSV пришлось бы прочитать все строки целиком.

Колоночность даёт и второе преимущество — сжатие. В одном столбце лежат однотипные значения (все возраста рядом, все имена рядом), а похожие данные сжимаются в разы лучше, чем перемешанные. Поэтому Parquet-файл часто в 5–10 раз меньше эквивалентного CSV, и это прямая экономия на хранении и на скорости чтения с диска.

ФорматТипыСжатиеДля чего
CSVнетнетобмен, выгрузки
JSONчастичнонетAPI, вложенные данные
Parquetдасильноеаналитика, lake

Как работает под капотом

Покажем, как из CSV-строк получить структуру средствами стандартной библиотеки. Модуль csv и json доступны в браузерном Python.

import csv, io, json

data = "id,name,age\n1,Анна,30\n2,Борис,25"
rows = list(csv.DictReader(io.StringIO(data)))
print(json.dumps(rows, ensure_ascii=False))
ages = [int(r["age"]) for r in rows]
print("Средний возраст:", sum(ages) / len(ages))

Вывод:

[{"id": "1", "name": "Анна", "age": "30"}, {"id": "2", "name": "Борис", "age": "25"}]
Средний возраст: 27.5

Обратите внимание: из CSV всё пришло строками ("age": "30") — типы пришлось восстанавливать вручную через int(). Именно эту проблему и решает Parquet, который хранит типы внутри файла. На наших курсах Pandas вы будете читать Parquet одной строкой pd.read_parquet(...) — но важно понимать, что у формата под капотом.

Частые ошибки

  • Хранить большие данные в CSV. На объёмах в миллионы строк CSV в разы тяжелее и медленнее Parquet.
  • Полагаться на «угаданные» типы. CSV не знает, что 007 — это число или строка; ведущие нули и даты часто ломаются.
  • Считать JSON компактным. Повтор ключей в каждой записи раздувает файл; для аналитики это дорого.

Итог

  • CSV прост и читаем, но без типов и сжатия — для обмена и выгрузок.
  • JSON хорош для вложенных структур и API, но многословен.
  • Parquet — колоночный, типизированный, сжатый — стандарт для аналитики.
Проверьте себя
1. Почему Parquet эффективнее CSV для аналитических запросов?
AОн хранит данные по столбцам и читает только нужные столбцы, плюс сжимается
BОн всегда меньше по размеру за счёт удаления данных
CОн читается человеком в текстовом редакторе
DОн не хранит типы данных
2. Какой недостаток у CSV как формата хранения?
AЕго не может прочитать ни одна программа
BОн не хранит типы данных — всё становится строками
CОн бинарный и нечитаемый
DОн поддерживает только числа