Форматы данных для SQL: Avro, TXT, ORC, CSV, JSON, PARQUET
Почему форматы данных так важны?
Выбор формата данных напрямую влияет на эффективность и производительность систем обработки и хранения информации. Если вы готовитесь к сертификации Microsoft DP-203 или работаете с данными из разных источников, то вам не обойтись без понимания этой темы.
В компаниях часто приходится работать с базами данных размером в несколько сотен гигабайт, содержащими разнородные данные.
В этом материале мы рассмотрим основные форматы, упомянем OLTP и OLAP системы, но главный упор сделаем именно на форматы. В конце приведём примеры для закрепления знаний.
Обзор форматов: достоинства и недостатки
| Формат | Тип | Достоинства | Недостатки | Оптимален для | Заменяет БД | Скриптовая обработка | Применение в AI |
|---|---|---|---|---|---|---|---|
| CSV | Строчный | ✓ Универсален<br/>✓ Легко читать/писать<br/>✓ Текстовый<br/>✓ Компактен для малых объёмов | ✗ Нет сжатия<br/>✗ Нет информации о схеме<br/>✗ Медленен на больших данных<br/>✗ Без типизации | Малые наборы, экспорт/импорт, ручная работа | ❌ Нет | ✓ Хорошо | ⚠️ Ограниченно |
| JSON | Строчный | ✓ Структурированные данные<br/>✓ Текстовый<br/>✓ Поддержка схемы<br/>✓ Веб-совместимость | ✗ Объёмнее CSV<br/>✗ Медленен на больших данных<br/>✗ Сложен для табличных данных<br/>✗ Дублирование | API, конфигурации, веб-сервисы, NoSQL | ⚠️ Частично | ✓ Хорошо | ✓ Очень хорошо |
| Parquet | Столбцовый | ✓ Высокое сжатие<br/>✓ Быстрый доступ по столбцам<br/>✓ Эволюция схемы<br/>✓ Оптимален для аналитики | ✗ Не читаемый для человека<br/>✗ Сложная настройка<br/>✗ Медленен при доступе по строкам<br/>✗ Лишняя память для малых данных | Big Data, аналитика, хранилища данных | ✓ Да | ⚠️ Специализированно | ✓ Очень хорошо |
| Avro | Строчный | ✓ Эволюция схемы<br/>✓ Хорошее сжатие<br/>✓ Быстрая запись<br/>✓ Потоковая обработка | ✗ Не читаемый для человека<br/>✗ Медленен при доступе по столбцам<br/>✗ Сложен для новичков<br/>✗ Ориентирован на Java | Потоки, события, микросервисы | ✓ Да | ✓ Хорошо | ✓ Хорошо |
| ORC | Столбцовый | ✓ Лучшее сжатие<br/>✓ Быстрая аналитика<br/>✓ Совместимость с Hive<br/>✓ Поддержка ACID | ✗ Сложный<br/>✗ Не читаемый для человека<br/>✗ Зависимость от Hive<br/>✗ Медленен при записи | Hadoop, Hive, Big Data аналитика | ✓ Да | ⚠️ Специализированно | ✓ Хорошо |
| XML | Строчный | ✓ Структурированные данные<br/>✓ Валидация (XSD)<br/>✓ Пространства имён<br/>✓ Самоописываемость | ✗ Очень объёмный<br/>✗ Сложный<br/>✗ Медленен<br/>✗ Устаревший | Легаси-системы, конфигурации, SOAP | ❌ Нет | ⚠️ Сложно | ⚠️ Редко |
| YAML | Строчный | ✓ Очень читаемый<br/>✓ Удобен для конфигов<br/>✓ Поддержка комментариев<br/>✓ Структурированный | ✗ Медленен<br/>✗ Сложен для больших данных<br/>✗ Чувствителен к ошибкам<br/>✗ Слабое сжатие | Конфигурационные файлы, DevOps, Docker | ❌ Нет | ✓ Хорошо | ⚠️ Редко |
Пояснения к шкалам оценки:
- Заменяет БД: может ли формат служить хранилищем данных?
- Скриптовая обработка: удобен ли для автоматизированной обработки?
- Применение в AI: подходит ли для машинного обучения и AI?
Основные причины, почему выбор формата критичен:
-
Производительность и эффективность Разные форматы оптимизированы под разные сценарии. Правильный выбор существенно ускоряет запросы, чтение и запись.
-
Экономия дискового пространства Некоторые форматы обеспечивают лучшую компрессию, что снижает потребление памяти. Это особенно важно при работе с большими объёмами данных.
-
Совместимость Формат влияет на возможность интеграции с разными системами и инструментами. Одни форматы лучше работают с конкретными технологиями.
-
Целостность данных и эволюция схемы Форматы вроде Avro и Parquet хранят информацию о схеме вместе с данными, что упрощает эволюцию и валидацию.
-
Специфические требования Разные задачи требуют разной структуры и разных способов доступа к данным. Формат выбирается под конкретные нужды.
Разница между строчным и столбцовым хранением
Упрощённо: хотя таблица состоит из строк и столбцов, разница в том, как данные физически организованы на диске и как их обрабатывает система. Это сильно влияет на скорость операций.
Вот подробное объяснение:
Строчное хранение (Row-based Storage)
Определение При строчном хранении все значения одной строки сохраняются подряд. Каждая строка это полный набор данных.
Пример: Таблица с информацией о клиентах:
| КлиентID | Имя | Возраст | Город |
|---|---|---|---|
| 1 | Alice | 30 | Bochum |
| 2 | Bob | 25 | Essen |
| 3 | Charlie | 35 | Dortmund |
В строчном хранении каждая строка сохраняется как единое целое.
Достоинства:
-
Эффективность транзакций Идеально для OLTP систем, где часто читают и пишут целые строки. Это обеспечивает быстрые операции вставки, обновления и удаления.
-
Простота управления Интуитивная модель данных, отражающая естественную структуру большинства приложений.
Недостатки:
Неэффективно для аналитических запросов, которые работают с отдельными столбцами. При этом приходится читать ненужные данные.
Столбцовое хранение (Column-based Storage)
Определение При столбцовом хранении все значения одного столбца сохраняются подряд. Каждый столбец содержит все значения атрибута для множества строк.
Пример Та же таблица в столбцовом формате:
КлиентID: [1, 2, 3] Имя: [Alice, Bob, Charlie] Возраст: [30, 25, 35] Город: [Berlin, München, Hamburg]
Каждый столбец хранится отдельно.
Достоинства:
-
Производительность запросов Идеально для OLAP систем, где аналитические запросы часто касаются только конкретных столбцов. Это даёт более быстрые запросы и меньшую нагрузку на ввод-вывод.
-
Лучшая компрессия Похожие значения хранятся рядом, что улучшает сжимаемость и экономит место.
-
Эффективные агрегации Функции типа SUM, AVG, COUNT выполняются быстрее.
Недостатки:
Неэффективно для транзакций, когда нужно читать или писать целые записи. При этом требуется доступ к нескольким столбцам.
Краткий итог
Строчное хранение (Row-based Storage)
- Оптимально для: OLTP систем с частыми транзакциями.
- Достоинства: быстрое чтение и запись полных записей.
- Форматы: CSV, JSON, Avro.
Столбцовое хранение (Column-based Storage)
- Оптимально для: OLAP систем с аналитическими запросами.
- Достоинства: быстрые запросы и эффективное сжатие.
- Форматы: Parquet, ORC.
Выбор между строчным и столбцовым хранением зависит от конкретных задач. OLTP системы выигрывают от строчного формата, OLAP системы от столбцового.
OLTP и OLAP системы
Напоминаем основные определения:
OLTP системы (Online Transaction Processing) Системы для управления и обработки большого количества коротких онлайн-транзакций с частыми операциями чтения и записи. Типичны для e-commerce, банков и бухгалтерии, где критичны скорость и целостность данных.
OLAP системы (Online Analytical Processing) Системы для анализа больших объёмов данных с целью создания сложных отчётов и срезов. Типичны для хранилищ данных и Business Intelligence, где необходимы быстрые и эффективные запросы и агрегации.
Строчное против столбцового хранения в контексте OLTP и OLAP
Для полного понимания различий между этими подходами важно рассмотреть специфику OLTP и OLAP систем.
Строчное хранение (Row-based Storage)
Определение Данные сохраняются построчно, все значения одной строки хранятся подряд. Каждая строка это полный набор данных.
Типичное применение:
OLTP системы (Online Transaction Processing) Приложения на основе транзакций, например e-commerce, банкинг, учёт.
Достоинства:
- Быстрая запись: полные записи сохраняются в одном месте, поэтому вставки и обновления выполняются быстро.
- Эффективные транзакции: OLTP системы получают выгоду от быстрой обработки транзакций, так как целые строки читаются и пишутся быстро.
- Простое управление: строчные базы проще проектировать и администрировать, так как структура обычно соответствует естественной организации данных.
Примеры форматов:
CSV: простой текстовый формат, широко распространённый и легко читаемый. JSON: текстовый формат, хорош для иерархических и вложенных данных. Avro: двоичный формат, оптимизирован для быстрой сериализации и десериализации.
Столбцовое хранение (Column-based Storage)
Определение: Данные сохраняются по столбцам, все значения одного столбца хранятся подряд. Каждый столбец содержит значения для конкретного атрибута на множество строк.
Типичное применение:
OLAP системы (Online Analytical Processing) Хранилища данных, Big Data аналитика, приложения Business Intelligence.
Достоинства:
- Быстрые запросы: запросы, касающиеся только конкретных столбцов, выполняются очень быстро, так как нужно прочитать только релевантные столбцы.
- Высокая компрессия: похожие значения хранятся рядом, поэтому столбцовые форматы достигают высокой степени сжатия и снижают потребление памяти.
- Эффективные агрегации: функции вроде SUM, AVG, COUNT, MIN, MAX работают быстрее, так как данные обрабатываются по столбцам.
Примеры форматов:
Parquet: столбцовый формат, оптимизирован для высокой компрессии и эффективных запросов в среде Big Data. ORC: также столбцовый, особенно оптимизирован для окружения Hadoop с высокой степенью сжатия и быстрыми запросами.
Сравнение строчного и столбцового хранения
| Характеристика | Строчное (OLTP) | Столбцовое (OLAP) |
|---|---|---|
| Стратегия хранения | Строки целиком | Столбцы целиком |
| Типичные приложения | Системы с транзакциями (e-commerce, банки) | Системы аналитики (хранилища данных) |
| Преимущества производительности | Быстрые транзакции и запись | Быстрые запросы и агрегации |
| Компрессия | Более низкие коэффициенты | Более высокие коэффициенты |
| Примеры | CSV, JSON, Avro | Parquet, ORC |
Резюме
Строчное хранение (OLTP):
Идеально для систем, где часто читают и пишут полные записи. Типично для приложений, требующих быстрых операций вставки, обновления, удаления. Поддерживается форматами CSV, JSON и Avro.
Столбцовое хранение (OLAP):
Идеально для систем, обрабатывающих и агрегирующих большие наборы данных. Типично для хранилищ данных и Big Data аналитики, где производительность запросов и сжатие критичны. Поддерживается форматами Parquet и ORC.
Переходим к конкретным форматам
Чтобы получить полное представление о различных форматах данных в контексте SQL и Azure, рассмотрим Avro, TXT, ORC, CSV, JSON и Parquet, их достоинства и недостатки, а также различия между строчным и столбцовым подходом.
Форматы данных и их использование
1. Avro
Описание Строчный формат хранения, разработанный Apache. Специально спроектирован для эффективной обработки Big Data.
Достоинства Avro
- Поддержка богатых типов данных и сложных структур.
- Встроенная схема, упрощающая переносимость данных.
- Отличен для сериализации и десериализации.
- Использование: идеален для сохранения и передачи данных между различными Big Data инструментами.
2. TXT
Описание Один из самых простых и известных форматов: простой неструктурированный текстовый формат.
Достоинства:
- Легко читать и писать.
- Поддерживается везде.
- Использование: подходит для простого логирования данных или передачи, когда структура не критична.
3. ORC (Optimized Row Columnar)
Описание Столбцовый формат хранения, оптимизированный для работы в Hadoop.
Достоинства
- Высокая степень сжатия и низкое потребление памяти.
- Оптимизированная производительность запросов благодаря столбцовому доступу.
- Поддержка сложных типов данных и индексов.
- Использование: идеален для хранилищ данных и Big Data аналитики, особенно при запросах на больших объёмах данных.
4. CSV (Comma-Separated Values)
Описание: Простой текстовый формат, где значения разделены запятыми.
Достоинства CSV
- Легко создавать и читать.
- Широко поддерживается базами данных и приложениями.
- Использование: хорош для обмена данными между разными системами и простыми наборами данных.
5. JSON (JavaScript Object Notation)
Описание Текстовый формат для представления структурированных данных на основе синтаксиса JavaScript.
Достоинства JSON:
- Читаемый для человека и легко отлаживаемый.
- Поддерживает иерархические и вложенные структуры.
- Широко распространён в веб-приложениях и API.
- Использование: идеален для сохранения и передачи данных в веб-приложениях и API.
6. Parquet
Описание: Столбцовый формат хранения, оптимизированный для работы в Hadoop и других фреймворках обработки Big Data.
Достоинства: Эффективная компрессия данных и экономия пространства. Оптимизированная производительность благодаря столбцовому доступу. Поддержка сложных типов данных.
Использование
Идеален для аналитических запросов в хранилищах данных и Big Data аналитике.
Различия между построчным и постолбцовым хранением
Построчное (Row-based):
- Данные хранятся построчно.
Подходит для транзакционных систем, где целые строки часто читаются и записываются. Примеры: Avro, TXT, CSV, JSON.
Постолбцовое (Column-based):
Данные хранятся постолбцово. Подходит для аналитических запросов, которые обращаются только к определённым столбцам и требуют меньше операций ввода-вывода. Примеры: ORC, Parquet.
Небольшой FAQ с примерами для разграничения:
Вопрос: Когда использовать Parquet вместо CSV?
Ответ: Parquet идеален для Big Data Analytics, так как он постолбцовый и обеспечивает лучшую производительность при запросах к конкретным столбцам. CSV лучше подходит для простого обмена данными и случаев, когда важна читаемость человеком.
Вопрос: Какие преимущества JSON имеет перед Avro для передачи данных в веб-приложениях?
Ответ: JSON читаем для человека и широко распространён в веб-приложениях и API. Хорошо подходит для иерархических структур данных. Avro в свою очередь обеспечивает лучшее сжатие и эффективность при передаче больших объёмов данных между инструментами Big Data.
Вопрос: В каком сценарии выбрать ORC вместо Parquet?
Ответ: Оба формата постолбцовые и оптимизированы для аналитических запросов. ORC может быть предпочтительнее, если на первый план выходит интеграция с экосистемой Hadoop или требуется особо высокая степень сжатия и поддержка сложных типов данных.
Резюме
Выбор подходящего формата данных зависит от конкретного случая использования.
Вот несколько общих рекомендаций:
- Используйте Avro для сериализации и передачи Big Data.
- Используйте TXT для простых неструктурированных данных.
- Выбирайте ORC или Parquet для постолбцовых аналитических запросов.
- Используйте CSV для простого обмена данными.
- Выбирайте JSON для структурированных данных в веб-приложениях и API.
Что такое сериализация и десериализация
Часто встречается термин “сериализация”, но что он означает?
Сериализация
Процесс преобразования объекта данных в формат, который можно сохранить или передать. Это включает преобразование в такие форматы как JSON, Avro или Parquet.
Пример: объект Java преобразуется в JSON-строку для отправки по сети.
Десериализация
Обратный процесс сериализации, при котором сохранённый или переданный формат преобразуется обратно в объект данных.
Пример: JSON-строка преобразуется обратно в объект Java для дальнейшей обработки в программе.
Практические примеры использования форматов данных - SQL: Avro, txt, ORC, CSV, JSON, PARQUET
15 практических вопросов и ответов по форматам данных и их применению
Вопрос 1: Логи веб-сервера
Ситуация: Нужно хранить логи веб-сервера, состоящие в основном из текста, которые должны быть легко читаемы.
Ответ: TXT
Пояснение: TXT-файлы просто читаются и записываются, идеальны для простых неструктурированных текстовых данных вроде логов.
Вопрос 2: Большие аналитические данные
Ситуация: Работаете над анализом Big Data и нужно хранить большие объёмы данных постолбцово для оптимизации запросов.
Ответ: Parquet
Пояснение: Parquet - постолбцовый формат хранения, обеспечивающий эффективное сжатие и быстрые запросы при работе со столбцами.
Вопрос 3: Сложные структуры данных
Ситуация: Передаёте сложные, вложенные структуры данных между различными приложениями Big Data.
Ответ: Avro
Пояснение: Avro поддерживает сложные и вложенные типы данных, схема сохраняется вместе с данными, что облегчает взаимодействие между системами.
Вопрос 4: Передача данных через Web-API
Ситуация: Нужно передать данные из веб-приложения на сервер в формате, понятном человеку.
Ответ: JSON
Пояснение: JSON легко читается и широко распространён в веб-приложениях, идеален для передачи структурированных данных.
Вопрос 5: Универсальный обмен данными
Ситуация: Требуется обменяться табличными данными между различными базами данных и инструментами, поддерживающими один простой формат.
Ответ: CSV
Пояснение: CSV - широко распространённый формат табличных данных, поддерживается практически всеми БД и инструментами.
Вопрос 6: Аналитика в Hadoop
Ситуация: Сохраняете большие объёмы аналитических данных в кластере Hadoop и нуждаетесь в высокой степени сжатия.
Ответ: ORC
Пояснение: ORC обеспечивает высокую степень сжатия и оптимизирован для окружений Hadoop.
Вопрос 7: Табличные процессоры
Ситуация: Хотите быстро и просто сохранить небольшой объём данных в табличном процессоре и редактировать их.
Ответ: CSV
Пояснение: CSV просто создавать, легко открывать и редактировать в программах вроде Excel.
Вопрос 8: Логи в Data Warehouse
Ситуация: Передаёте большой объём логов в Data Warehouse и хотите эффективного хранения и обработки.
Ответ: Parquet
Пояснение: Parquet идеален для хранения и обработки больших объёмов данных в Data Warehouses благодаря постолбцовой структуре.
Вопрос 9: Сериализация Big Data
Ситуация: Нужно сериализовать большое количество записей и передать их между различными инструментами Big Data.
Ответ: Avro
Пояснение: Avro специально оптимизирован для сериализации больших объёмов данных и поддерживает передачу между разными инструментами Big Data.
Вопрос 10: Разработка Web-API
Ситуация: Создаёте Web-API, которая должна отдавать структурированные данные различным клиентам.
Ответ: JSON
Пояснение: JSON - стандартный формат для Web-API, обеспечивает простую передачу и обработку структурированных данных.
Вопрос 11: Аналитика Data Lake
Ситуация: Сохраняете и анализируете данные в Data Lake, при этом нужна высокая эффективность хранения и запросов.
Ответ: Parquet или ORC
Пояснение: Оба формата предоставляют постолбцовое хранилище и высокую эффективность при работе с большими объёмами данных.
Вопрос 12: Оптимизация CSV
Ситуация: Есть CSV-файл с миллионами строк, нужно улучшить эффективность хранения и обработки.
Ответ: Parquet
Пояснение: Parquet обеспечивает лучшее сжатие и производительность запросов на больших объёмах данных по сравнению с CSV.
Вопрос 13: Экспорт из базы данных
Ситуация: Нужно экспортировать данные из реляционной БД в Big Data систему, сохраняя структуру.
Ответ: Avro
Пояснение: Avro поддерживает сложные и вложенные типы данных и хорошо отображает структуру реляционной БД.
Вопрос 14: Azure Data Factory
Ситуация: Нужно сохранить данные в pipeline Azure Data Factory и обработать их дальше.
Ответ: Parquet или JSON
Пояснение: Оба формата хорошо подходят для обработки в Data Pipelines, обеспечивают эффективное хранение и позволяют быстро выполнять запросы.
Вопрос 15: Обработка IoT-данных
Ситуация: Есть данные от IoT-устройств, которые часто нужно обновлять и быстро обрабатывать.
Ответ: Avro
Пояснение: Avro идеален для потоковых данных от IoT-устройств благодаря быстрой сериализации/десериализации и поддержке эволюции схемы.



