← Назад к вопросам

Какие есть другие форматы хранения?

1.0 Junior🔥 201 комментариев
#Форматы данных и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Форматы хранения данных

В 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

Сравнительная таблица

ФорматРазмерСкорость чтенияСхемаСложностьOLAPStreaming
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

  1. Используй Parquet как default для аналитики и хранения
  2. JSON для API и обмена между системами
  3. Delta Lake для production data warehouse
  4. Iceberg для критичных данных с требованиями ACID
  5. CSV только для экспорта и обмена, не для хранения
  6. Версионируй схему вместе с данными
  7. Мониторь размер файлов и регулярно переписывай данные

Выводы

Выбор формата хранения — это важное архитектурное решение. Для большинства data engineering проектов Parquet остаётся лучшим выбором благодаря балансу между производительностью, сжатием и совместимостью. Delta Lake/Iceberg добавляют ACID гарантии для production. JSON и CSV используются для обмена, а специализированные форматы (Avro, Protobuf) — для систем с высокими требованиями к производительности.

Какие есть другие форматы хранения? | PrepBro