Какие есть другие форматы хранения?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Форматы хранения данных
В modern data engineering существует множество форматов для хранения данных, каждый с определёнными преимуществами и недостатками. Выбор формата зависит от типа данных, сценариев использования и требований к производительности.
Columnar форматы (оптимальны для OLAP)
Parquet
- Самый популярный columnar формат в big data
- Сжимается в 5-10 раз лучше, чем CSV
- Отличная производительность при читке отдельных колонок
- Поддерживает nested structures (JSON-like)
# Использование
import pandas as pd
df = pd.read_parquet('data.parquet')
df.to_parquet('output.parquet', compression='snappy')
# Spark
df.write.format('parquet').save('/path')
ORC (Optimized Row Columnar)
- Разработана Facebook, оптимизирована для Hive
- Лучше Parquet в некоторых сценариях (особенно с Hive)
- Меньше поддержка в экосистеме, чем Parquet
# Spark
df.write.format('orc').save('/path')
df = spark.read.format('orc').load('/path')
Arrow (Apache Arrow)
- In-memory columnar format
- Быстрое межпроцессное общение
- Optimized для аналитики
import pyarrow.parquet as pq
table = pq.read_table('data.parquet')
Row-based форматы
CSV (Comma-Separated Values)
- Самый простой и универсальный
- Человеко-читаемый
- Медленный при работе с большими объёмами (no compression)
- Нет информации о типах данных
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
JSON
- Поддерживает nested структуры
- Метаданные встроены в каждый объект (лишние данные)
- Медленнее CSV и Parquet при больших объёмах
- Хорошо для API и обмена данными
df = pd.read_json('data.jsonl') # Newline-delimited JSON
df.to_json('output.jsonl', orient='records', lines=True)
JSONL (JSON Lines)
- Одна JSON-запись на строку
- Лучше подходит для streaming обработки
- Легче парсить и разделять на батчи
{"id": 1, "name": "Alice"}
{"id": 2, "name": "Bob"}
{"id": 3, "name": "Charlie"}
Специализированные форматы
Delta Lake
- Слой ACID транзакций поверх Parquet
- Time travel, rollback, ACID гарантии
- Используется в lakehouse архитектуре
df.write.format('delta').mode('overwrite').save('/data')
df = spark.read.format('delta').load('/data')
# Time travel
df = spark.read.format('delta').option('versionAsOf', 0).load('/data')
Apache Iceberg
- Конкурент Delta Lake
- Улучшенная схема эволюции и скрытые партиции
- Лучшая совместимость между движками
df.write.format('iceberg').mode('overwrite').save('s3://bucket/table')
Apache Hudi
- Incremental processing и indexing
- Копия-on-write и merge-on-read
- Сложнее, чем Delta/Iceberg
Time-series форматы
InfluxDB Line Protocol
- Специализирован для временных рядов
- Компактный формат
- Быстрое написание
measurement,tag1=value1,tag2=value2 field1=value1,field2=value2 timestamp
temperature,location=room1,sensor=DHT22 value=23.5,humidity=45.2 1609459200000000000
Graphite format
- Простой текстовый формат для метрик
metric.name value timestamp
system.cpu.load 45.2 1609459200
Бинарные форматы
Avro
- Разработана для Hadoop
- Компактный бинарный формат
- Хорошая схема эволюция
- Менее популярна, чем Parquet
from fastavro import writer, reader
records = [{'name': 'Alice', 'age': 30}]
with open('data.avro', 'wb') as f:
writer(f, schema, records)
Protocol Buffers (Protobuf)
- Google's serialization format
- Очень компактный и быстрый
- Требует .proto схемы
- Не очень удобен для analytics
Thrift
- Apache's serialization framework
- Похож на Protobuf
- Поддерживает множество языков
Текстовые форматы с компрессией
Compressed CSV/JSON
# Gzip
gzip -9 data.csv # data.csv.gz
# Bzip2
bzip2 data.csv # data.csv.bz2
# Zstd (современный)
zstd data.csv # data.csv.zst
Выбор формата по сценарию
Для OLAP (аналитика, большие объёмы)
- Parquet (best choice)
- ORC (с Hive)
- Arrow (в памяти)
- Delta Lake (с ACID)
Для OLTP (транзакции, часто обновления)
- JSON
- Avro
- Delta Lake
Для streaming/real-time
- JSONL
- Avro
- Parquet (с append mode)
Для обмена данными
- CSV
- JSON
- Protobuf (между системами)
Для временных рядов
- InfluxDB Line Protocol
- Parquet (с партицией по времени)
- TimeScale PostgreSQL
Сравнительная таблица
| Формат | Размер | Скорость чтения | Схема | Сложность | OLAP | Streaming |
|---|---|---|---|---|---|---|
| CSV | Большой | Медленно | Нет | Низкая | Плохо | Плохо |
| JSON | Большой | Медленно | Встроена | Средняя | Плохо | Хорошо |
| Parquet | Малый | Быстро | Да | Средняя | Отлично | Среднее |
| ORC | Малый | Быстро | Да | Средняя | Отлично | Среднее |
| Avro | Малый | Быстро | Обязательна | Средняя | Хорошо | Хорошо |
| Delta | Малый | Быстро | Да | Высокая | Отлично | Хорошо |
| Iceberg | Малый | Быстро | Да | Высокая | Отлично | Хорошо |
Параметры компрессии
# Parquet с разными сжатиями
df.write.parquet('data.parquet', compression='snappy') # Быстро
df.write.parquet('data.parquet', compression='gzip') # Лучше
df.write.parquet('data.parquet', compression='zstd') # Лучшее
df.write.parquet('data.parquet', compression='uncompressed') # Нет сжатия
Best Practices
- Используй Parquet как default для аналитики и хранения
- JSON для API и обмена между системами
- Delta Lake для production data warehouse
- Iceberg для критичных данных с требованиями ACID
- CSV только для экспорта и обмена, не для хранения
- Версионируй схему вместе с данными
- Мониторь размер файлов и регулярно переписывай данные
Выводы
Выбор формата хранения — это важное архитектурное решение. Для большинства data engineering проектов Parquet остаётся лучшим выбором благодаря балансу между производительностью, сжатием и совместимостью. Delta Lake/Iceberg добавляют ACID гарантии для production. JSON и CSV используются для обмена, а специализированные форматы (Avro, Protobuf) — для систем с высокими требованиями к производительности.