Ответ
В контексте построения хранилищ данных (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.