Ограничения текстовых форматов для аналитики
Почему текстовые форматы плохи для аналитики
CSV, JSON и XML были созданы для обмена данными — передачи от системы А к системе Б с максимальной совместимостью. Аналитические запросы предъявляют принципиально другие требования: выборочное чтение столбцов, фильтрация по условиям без полного сканирования, агрегации на миллиардах строк. Текстовые форматы не удовлетворяют ни одному из этих требований.
Read path: CSV full scan vs Parquet column pruning
Рассмотрим запрос SELECT name, age FROM users WHERE country = 'RU' на таблице с 50 столбцами и 100 миллионов строк:
Разница: CSV читает 100% файла для извлечения 2% данных. Parquet читает ~3% файла. На 10 GB файле: CSV scan = 10 GB I/O, Parquet = ~300 MB I/O.
Schema-on-read: ошибки обнаруживаются поздно
Schema-on-read означает, что структура и типы данных определяются при чтении, а не при записи. Для CSV/JSON это единственная модель — файл не содержит схему:
Splittability: параллельная обработка
Distributed processing (Spark, Flink, Trino) требует разбиения файла на фрагменты (splits) для параллельной обработки. Текстовые форматы создают проблемы:
Отсутствие encoding и compression
Текстовые форматы хранят данные как ASCII/UTF-8 текст без специализированного кодирования. Columnar форматы используют encoding, специфичный для каждого столбца:
Query execution: полный контраст
Разница: 45 секунд vs 50 миллисекунд — 900× быстрее. На более крупных данных разрыв увеличивается.
Отсутствие statistics и метаданных
Columnar форматы хранят statistics для каждого row group: min/max значения, null count, distinct count. Это позволяет пропускать целые группы строк без чтения данных:
Compression awareness
Текстовые форматы можно сжать внешним компрессором (gzip, zstd), но это создаёт дополнительные проблемы:
Spark поддерживает splittable compression для CSV: bzip2 (.csv.bz2) и lzo (.csv.lzo с индексом). Но gzip (.csv.gz) — не splittable: один executor на файл. Для больших CSV в S3/HDFS: используйте bzip2 или разбивайте на много маленьких gzip-файлов (multifile parallelism).
Итог
Текстовые форматы (CSV, JSON, XML) фундаментально несовместимы с требованиями аналитических систем. Каждое ограничение — не баг, а следствие дизайна: формат без типов не может иметь encoding, формат без метаданных не может иметь predicate pushdown, формат без структуры не может быть splittable. Для аналитики используйте columnar форматы (Parquet, ORC) — они спроектированы именно для этого. Текстовые форматы — для транспорта и обмена, не для хранения и запросов.