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

С какими форматами данных работал

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

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

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

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

Форматы данных в Data Engineering

Выбор формата данных критически влияет на производительность, стоимость хранения и скорость обработки. Data Engineer должен знать strengths и weaknesses каждого формата.

1. CSV (Comma-Separated Values)

Характеристики:

  • Текстовый формат
  • Легко читается человеком
  • Нет встроенной сжатия
  • Нет типизации
  • Медленный парсинг

Пример:

user_id,name,email,age,country
1,John,john@example.com,30,USA
2,Jane,jane@example.com,28,UK
3,Bob,bob@example.com,35,CA

Использование в Python:

import pandas as pd

# Чтение
df = pd.read_csv('data.csv')

# Запись
df.to_csv('output.csv', index=False)

# Для больших файлов используй chunks
chunks = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunks:
    process(chunk)

Когда использовать:

  • Обмен данными с non-technical users
  • Экспорт для Excel/Tableau
  • Небольшие dataset-ы (< 1 GB)
  • Человеческий контроль

Когда НЕ использовать:

  • Большие файлы (парсинг медленный)
  • Time-series данные
  • Вложенные структуры (JSON)

2. JSON (JavaScript Object Notation)

Характеристики:

  • Полуструктурированный формат
  • Поддерживает вложенные структуры
  • Текстовый (легко читается)
  • Медленнее CSV для таблиц
  • Язык-агностичный

Пример:

{
  "user_id": 1,
  "name": "John",
  "email": "john@example.com",
  "address": {
    "city": "New York",
    "country": "USA",
    "zip": "10001"
  },
  "tags": ["vip", "early_adopter", "premium"]
}

Использование:

import json
import pandas as pd

# Чтение JSON
with open('data.json') as f:
    data = json.load(f)  # list of dicts

# Конвертация в DataFrame
df = pd.DataFrame(data)

# Работа с вложенными структурами
df['city'] = df['address'].apply(lambda x: x['city'])

# Запись JSON
df.to_json('output.json', orient='records')  # list of dicts
df.to_json('output.json', orient='split')    # {'index': [...], 'columns': [...], 'data': [...]}

Когда использовать:

  • API responses
  • Event logs (полуструктурированные)
  • Конфигурационные файлы
  • Вложенные или иерархичные данные

Когда НЕ использовать:

  • Большие табличные данные (неэффективно)
  • Двоичные данные
  • Real-time streaming (медленнее Avro/Protobuf)

3. Parquet

Характеристики:

  • Бинарный колончатый формат
  • Встроенная сжатие (10x-100x)
  • Быстрое чтение (читай только нужные столбцы)
  • Предпочтителен для Spark/Big Data
  • Типизирован (schema validation)

Пример использования:

import pandas as pd
import pyarrow.parquet as pq

# Чтение parquet
df = pd.read_parquet('data.parquet')

# Чтение с фильтром (очень быстро!)
df = pd.read_parquet('data.parquet', columns=['user_id', 'amount'])

# Запись
df.to_parquet('output.parquet', compression='snappy')
df.to_parquet('output.parquet', compression='gzip')  # меньше размер, медленнее

# Со Spark
df_spark = spark.read.parquet('s3://bucket/data.parquet')

# Партиционирование (очень важно!)
df_spark.write.parquet(
    's3://bucket/output/',
    partitionBy=['date', 'country']  # Создаёт структуру: date=2024-01-15/country=USA/...
)

Размер сравнения:

CSV:       1000 MB
JSON:       800 MB
Parquet:    100 MB (10x меньше!)

Когда использовать:

  • Основной формат для Big Data (Spark, Hadoop)
  • Data Lakes на S3
  • DWH (Snowflake, BigQuery хранят в parquet)
  • Когда размер и скорость критичны

Когда НЕ использовать:

  • Человеческий контроль (бинарный)
  • Очень простые таблицы (может быть overkill)

4. ORC (Optimized Row Columnar)

Характеристики:

  • Альтернатива Parquet (часто быстрее)
  • Бинарный колончатый формат
  • Встроенные индексы и статистика
  • Предпочитаем в Hive/Hadoop

Пример:

# ORC обычно используется с Hive/Spark
df_spark.write.format('orc').mode('overwrite').save('s3://bucket/data/')

# Чтение
df = spark.read.format('orc').load('s3://bucket/data/')

Parquet vs ORC:

  • Parquet: лучше для heterogeneous workloads
  • ORC: лучше для Hive, часто быстрее

5. Avro

Характеристики:

  • Бинарный формат с встроенной схемой
  • Отличный для Kafka messaging
  • Компактный и быстрый парсинг
  • Поддерживает эволюцию схемы

Пример с Kafka:

from confluent_kafka import Producer, Consumer
from confluent_kafka.avro import AvroProducer, AvroConsumer

# Schema
schema = {
    'type': 'record',
    'name': 'Event',
    'fields': [
        {'name': 'user_id', 'type': 'int'},
        {'name': 'event_type', 'type': 'string'},
        {'name': 'timestamp', 'type': 'long'}
    ]
}

# Producer с Avro
producer = AvroProducer(
    {'bootstrap.servers': 'localhost:9092',
     'schema.registry.url': 'http://localhost:8081'},
    default_value_schema=schema
)

# Отправка
producer.produce(
    topic='events',
    value={'user_id': 1, 'event_type': 'login', 'timestamp': 1234567890}
)

Когда использовать:

  • Kafka streaming
  • Real-time processing
  • Когда нужна эволюция схемы

6. Protocol Buffers (Protobuf)

Характеристики:

  • Бинарный формат от Google
  • Компактный и быстрый
  • Сильная типизация
  • Используется в микросервисах

Пример:

syntax = "proto3";

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  repeated string tags = 4;
}

Использование в Python:

from user_pb2 import User

# Создание
user = User()
user.id = 1
user.name = "John"
user.email = "john@example.com"
user.tags.append("vip")

# Сериализация
serialized = user.SerializeToString()

# Десериализация
user2 = User()
user2.ParseFromString(serialized)

Когда использовать:

  • Микросервисы
  • gRPC
  • Когда нужна максимальная производительность

7. Apache Arrow

Характеристики:

  • Колончатый in-memory формат
  • Стандарт для Data Science
  • Очень быстрый (zero-copy sharing)
  • Основа для Parquet, ORC

Пример:

import pyarrow as pa

# Создание table
table = pa.table({
    'user_id': [1, 2, 3],
    'amount': [100.5, 200.0, 150.25]
})

# Конвертация в Pandas (очень быстро)
df = table.to_pandas()

# Сохранение в Parquet
table.to_pandas().to_parquet('output.parquet')

8. HDF5 (Hierarchical Data Format)

Характеристики:

  • Иерархичный формат
  • Поддерживает компрессию
  • Хорош для scientific data
  • Медленнее для Big Data

Пример:

import h5py

# Запись
with h5py.File('data.h5', 'w') as f:
    f.create_dataset('users', data=np.array([[1, 2], [3, 4]]))
    f.create_dataset('events', data=np.array([100, 200, 300]))

# Чтение
with h5py.File('data.h5', 'r') as f:
    users = f['users'][:]
    events = f['events'][:]

Когда использовать:

  • Scientific computing
  • Machine learning datasets (подготовка)

9. Текстовые форматы для логов

Неструктурированные логи:

2024-01-15 10:30:45 ERROR Database connection failed: timeout after 5s
2024-01-15 10:30:46 WARN Retrying connection attempt 1/3
2024-01-15 10:30:47 INFO Successfully connected to database

Структурированные логи (JSON):

{"timestamp": "2024-01-15T10:30:45Z", "level": "ERROR", "service": "api", "message": "Database connection failed", "error_code": "TIMEOUT"}

Обработка логов:

import json
from datetime import datetime

# Парсинг JSON логов
logs = []
with open('app.log') as f:
    for line in f:
        try:
            log = json.loads(line)
            logs.append(log)
        except json.JSONDecodeError:
            continue

# Фильтр по уровню
errors = [log for log in logs if log['level'] == 'ERROR']

Матрица выбора формата

ФорматРазмерСкоростьТипизацияИспользование
CSVБольшойМедленноНетExport, обмен
JSONСреднийСреднеНетAPI, логи
ParquetМаленькийБыстроДаBig Data, Data Lake
ORCМаленькийОчень быстроДаHive, DWH
AvroМаленькийБыстроДаKafka, streaming
ProtobufОчень маленькийОчень быстроДаМикросервисы

Практические рекомендации

Data Pipeline:

Raw data (CSV) 
  ↓ ETL (очистка, валидация)
Parquet files (S3 Data Lake)
  ↓ Spark processing
ORC files (DWH)
  ↓ Запросы (SQL)
Результаты (CSV/JSON для downstream)

Real-time:

Application events (JSON)
  ↓ Kafka (Avro для эффективности)
Stream Processing (Spark Streaming)
  ↓ Parquet (для хранения)
Real-time analytics (BigQuery)

На собеседовании:

Расскажи:

  1. CSV для обмена, Parquet для Big Data
  2. JSON для APIs и логов
  3. Avro для Kafka streaming
  4. Критерии выбора: размер, скорость, типизация, использование
  5. Конкретные примеры из своих проектов
С какими форматами данных работал | PrepBro