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

«С какими форматами данных работал?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте построения хранилищ данных (DWH) и ETL-процессов я работал с широким спектром форматов, каждый из которых выбирался под конкретную задачу.

Структурированные/Табличные форматы:

  • CSV/TSV: Использовал для сырых выгрузок из legacy-систем. Основные проблемы — отсутствие схемы, разные кодировки, escaping кавычек и переносов строк. Обрабатывал с помощью специализированных ридеров (например, csv.DictReader в Python) или на этапе загрузки в staging-слой DWH.
  • Parquet & ORC: Основные форматы для хранения данных в DWH (например, в HDFS или S3) и для обработки в Spark. Их главное преимущество — колоночная организация, сжатие и встроная статистика (min/max), что сильно ускоряет агрегации. Пример создания таблицы в Hive с форматом Parquet:
    CREATE TABLE events_parquet (
        user_id BIGINT,
        event_time TIMESTAMP,
        action STRING
    )
    STORED AS PARQUET
    LOCATION '/data/events/';
  • Avro: Использовал как формат для сериализации данных в Kafka, благодаря compact binary формату и встроенной схеме (schema), которая передается вместе с данными, что обеспечивает совместимость версий.

Полуструктурированные форматы:

  • JSON: Стандарт для API и логов. В DWH загружал в колонки типа JSON (в PostgreSQL) или STRUCT/MAP (в Hive/Spark), с последующим разбором (flattening) на этапе трансформации.
  • XML: Встречался в данных от внешних поставщиков. Обработка была ресурсоемкой, использовал либо специализированные XML-парсеры на стороне ETL-инструмента (например, в Pentaho), либо преобразовывал в JSON на раннем этапе.

Выбор формата всегда был компромиссом. Для аналитических запросов к большим объемам — Parquet. Для потоковой передачи с контролем схемы — Avro. Для гибкости и простоты отладки на этапе загрузки — JSON.