Форматы данных: 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 — колоночный, типизированный, сжатый — стандарт для аналитики.