BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » DuckDB с нуля: встроенная аналитическая база данных » Работа с Parquet: чтение, запись, схемы и метаданные

Работа с Parquet: чтение, запись, схемы и метаданные

Parquet - это колонно-ориентированный формат хранения данных, оптимизированный для аналитических нагрузок за счет эффективного сжатия и векторизированной обработки. Встроенная поддержка Parquet в DuckDB позволяет выполнять SQL-аналитику на локальных файлах без покидания аналитической среды, используя преимущества статистики, прешадинга (pushdown) и эффективной загрузки только необходимых столбцов и строк. В этой главе рассмотрены архитектурные принципы взаимодействия DuckDB с Parquet, сопоставление схем и типов, работа с метаданными и схемами, а также практические сценарии чтения и записи Parquet-файлов и их интеграцию в локальные аналитические пайплайны.

Паркет-дочери представляют собой сложную комбинацию файловой структуры и метаданных, где каждый файл содержит набор row groups, каждый row group - набор колонок, за которыми стоят страницы и словари. DuckDB реализует нативное чтение Parquet, минимизацию доступа к данным через статистику row group, поддержку вложенных типов и эффективную маршрутизацию запросов к данным. Понимание того, как именно DuckDB читает, кеширует и обрабатывает Parquet, позволяет проектировать более производительные аналитические пайплайны и правильно выбирать стратегию чтения и записи.

  • Архитектура Parquet в DuckDB
  • Схемы, типы данных и метаданные Parquet
  • Чтение и запись Parquet: SQL-интерфейс, API и примеры
  • Практические сценарии внедрения и лучшие практики

     

Архитектура Parquet в DuckDB

Parquet - это файловый формат, где основными единицами являются row groups, колонковые фрагменты и страницы. Каждый Parquet-файл имеет футер с метаданными, в котором зафиксированы схема файла, статистика по row groups и структура колонок. DuckDB строит взаимодействие с Parquet через несколько уровней абстракций: файловый доступ, разбор метаданных Parquet, ленивую загрузку нужных данных и векторизированное считывание данных в пределах сегментов выполнения.

 

Файловая структура Parquet и роль футера

Файл Parquet начинается с сериализованной структуры данных, разбитой по колонкам внутри row groups, и завершается футером. Футер содержит схему таблицы, список row groups с их статистикой, а также ссылки на страницы и словари. DuckDB читает футер напрямую или через последовательный проход по файлу, чтобы определить, какие объекты нужно загрузить для исполнения запроса. Стратегия минимизации доступа к данным основывается на статистике row group: многие запросы на фильтры по датам, диапазонам значений или по конкретным столбцам могут приводить к пропуску целых row groups без загрузки их содержимого.

 

Взаимодействие движка DuckDB с Parquet

DuckDB применяет ленивую загрузку и векторизированное чтение, чтобы минимизировать расход памяти и времени доступа. При выполнении запроса механизмы прушайнинга и проекции столбцов обрабатываются до физического чтения, что означает: DuckDB читает только те колонки, которые задействованы в запросе, и только те row groups, которые соответствуют фильтрам. Также DuckDB поддерживает разные схемы кодирования и словари Parquet, что влияет на распаковку и конвертацию данных в внутренные типы DuckDB.

 

Обработка вложенных структур

Parquet поддерживает вложенные типы (struct, list, map). DuckDB отображает их в рамках своего типа данных, обеспечивая доступ к вложенным полям через нотацию дерева структур либо в виде структурного столбца. В большинстве сценариев вложенные поля можно адресовать через точечную нотацию в SQL: например, field.subfield. Это позволяет сохранять корреляцию между структурой исходного Parquet и семантикой аналитики в DuckDB без явной денормализации.

 

Механизмы кэширования и повторного использования метаданных

DuckDB кэширует футеры паркетных файлов и статистику row groups, что ускоряет повторные запросы к тем же данным. Такой кэш особенно полезен в повторяющихся аналитических пайплайнах и при работе с большим набором Parquet-файлов однотипной структуры. Эффективное кэширование снижает задержку при старте запроса и уменьшает повторные обращения к диску.

 

Схемы, типы данных и метаданные Parquet

Понимание того, как DuckDB сопоставляет типы Parquet с внутренними типами и как обрабатываются изменение схемы, критично при построении устойчивых аналитических пайплайнов над Parquet.

 

Маппинг типов Parquet и DuckDB

Parquet поддерживает широкий набор примитивных типов и арифметических кодировок. DuckDB выполняет сопоставление типов Parquet с типами DuckDB таким образом, чтобы сохранить точность и поведение операций. Например:

  • INT32, INT64 соответствуют DuckDB INTEGER, BIGINT
  • FLOAT, DOUBLE - FLOAT/DOUBLE
  • BYTE_ARRAY, FIXED_LEN_BYTE_ARRAY - VARCHAR или BLOB в зависимости от контекста
  • BOOLEAN - BOOLEAN
  • TIMESTAMP, DATE - TIMESTAMP или DATE с учетом временной зоны
  • DECIMAL - DECIMAL(precision, scale)

Важно учитывать контекст использования: некоторые поля могут попадать под схему поиска по диапазонам, и точность целевых типов должна соответствовать требованиям аналитики. При отсутствии явного указания DuckDB может интерпретировать значения по умолчанию, что требует проверки данных.

 

Вложенные типы и эволюция схемы

Для вложенных структур Parquet поддерживает схему Evolution: файлы могут добавлять новые столбцы, изменять уровни вложенности или менять типы как часть процесса ETL. DuckDB обрабатывает добавляемые столбцы как NULL при чтении файла, если в файле их нет, и не ломает существующие запросы. При явном добавлении столбцов к набору данных в нескольких файлах и отсутствии полного единообразия DuckDB может потребовать явного указания схемы, чтобы обеспечить согласованность типов и имён столбцов в результатах.

 

Метаданные и статистика Parquet

Обозначение статистики на уровне row group включает минимальные и максимальные значения, количество нулей и другие агрегаты. DuckDB активно использует эту статистику для прушайнинга и планирования выполнения. Кроме того, словари и кодирование влияют на скорость декодирования и использование памяти. В случае больших наборов файлов с различной структурой DuckDB может администраству выполнять дополнительные проверки совместимости схем и, при необходимости, приводить данные к функциональной единице.

 

Чтение и запись Parquet: SQL-интерфейс, API и примеры

DuckDB предоставляет естественный SQL-интерфейс для чтения Parquet, а также API для взаимодействия через внешние языки. Ниже приведены базовые примеры и рекомендации.

-- Чтение Parquet через SQL
SELECT customer_id, order_date, total_amount
FROM read_parquet('data/orders.parquet')
WHERE order_date >= DATE '2020-01-01';

Чтение через read_parquet возвращает таблицу, которую можно сразу использовать в обычном SQL-операторе. При необходимости можно задать алиас и работать с вложенными полями через доступ к столбцам.

-- Чтение нескольких столбцов с явной проекцией
## SELECT c.customer_id, o.total_amount
## FROM read_parquet('data/orders.parquet') AS o
JOIN read_parquet('data/customers.parquet') AS c
## ON o.customer_id = c.customer_id
WHERE o.order_date BETWEEN DATE '2020-01-01' AND DATE '2020-12-31';

Запись Parquet из DuckDB осуществляется через конструкцию COPY. Это позволяет экспортировать результат выборки в Parquet-файл без промежуточного денормирования.

COPY (
  SELECT customer_id, total_amount, order_date
  FROM orders_summary
## WHERE total_amount > 100
) TO 'output/orders_summary.parquet' (FORMAT PARQUET);

DuckDB поддерживает запись Parquet как часть стандартного набора команд по экспорту данных, что полезно для генерации аналитических витрин, выгрузки в ленточные хранилища или передачи данных в другие системы. В рамках эволюционных пайплайнов имеет смысл комбинировать чтение из Parquet с последующей записью в Parquet после трансформаций.

-- Пример из Python через DuckDB Python API
import duckdb
con = duckdb.connect()

## Чтение Parquet напрямую из Python
df = con.execute(\"SELECT * FROM read_parquet('data/transactions.parquet')\").fetchdf()

## Небольшая агрегация в DuckDB и экспорт в Parquet
con.execute(\"CREATE TABLE agg AS SELECT customer_id, SUM(amount) AS total FROM transactions GROUP BY customer_id\")
con.execute(\"COPY (SELECT * FROM agg) TO 'data/agg_transactions.parquet' (FORMAT PARQUET)\")

Такие примеры иллюстрируют связку SQL и API на практике: DuckDB становится движком аналитики, который может за одну операцию трансформировать данные в Parquet и обратно.

 

Оптимизация чтения Parquet

  • Указывайте только необходимые столбцы: проекция позволяет DuckDB выбрать минимальный набор колонок из параллельных row groups.
  • Фильтры и прушайнинг: применение WHERE в запросе позволяет DuckDB пропускать целые row groups, если статистика показывает несоответствие диапазона условия.
  • Учет вложенных структур: если работа ведется с вложенными полями, держать в голове, что доступ к вложенным подполям может потребовать дополнительных операций преобразования.
  • Параллелизм и кэширование: DuckDB поддерживает параллельное выполнение и эффективное кэширование, что особенно важно при больших наборах Parquet-файлов.

     

Практические сценарии внедрения и лучшие практики

Работа с Parquet в DuckDB особенно эффективна в сценариях локальной аналитики, где данные доставляются в виде Parquet файлов из источников ETL, обработка и экспорт результата в тот же формат. Ключевые практики включают:

  • Планирование структуры данных: при работе с Parquet полезно поддерживать единый набор файлов и стабильную схему, чтобы избегать частой эволюции схемы в разных файлах и усложнения чтения. Это ускоряет прушайнинг и упрощает управление.

  • Управление схемой: когда возможно, фиксируйте схему на уровне корпоративной политики и используйте явную схему при импорте, чтобы обеспечить совместимость между средами разработки, тестирования и продакшена.

  • Этапы ETL: Parquet часто служит как промежуточный формат в пайплайнах. DuckDB может служить как точка агрегации и проверки качества данных, после чего результаты экспортируются в Parquet для длительного хранения или передачи.

  • Интеграции: DuckDB интегрируется с Python и R для анализа данных, а также поддерживает стандартный доступ к локальным и удаленным источникам через расширения. При работе с удаленными источниками следует учитывать доступ к сетевым хранилищам и требование к аутентификации.

  • Рекомендации по инфраструктуре: для больших наборов Parquet возможно применение SSD-накопителей и разумного размера блока для оптимизации пропускной способности. Важно обеспечить достаточно памяти для векторизированной обработки и использования кэширования.

  • Мониторинг и отладка: при сложных схемах полезно проводить предварительную инспекцию колонок и типов в Parquet, чтобы избежать неожиданной конверсии типов. DuckDB предоставляет диагностику выполнения запроса, включая план выполнения и статистику чтения Parquet.

     

Key takeaways

  • Parquet - эффективный колонно-ориентированный формат; DuckDB имеет встроенную поддержку чтения и записи Parquet с использованием прушайнинга, статистики row groups и векторизированной обработки.

  • Схемы и типы Parquet тесно связаны с внутренними типами DuckDB; вложенные структуры поддерживаются через структурированное представление столбцов и доступ к полям.

  • Чтение Parquet через SQL и функции read_parquet обеспечивает гибкость для анализа локальных данных; запись в Parquet через COPY позволяет быстро сохранять результаты в современный формат.

  • Производительность достигается за счет проекции столбцов, фильтрации на уровне row groups и грамотного использования статистики Parquet.

  • Интеграции в локальные пайплайны требуют учета инфраструктурных аспектов: единая политика версий схем, совместимость имён столбцов и устойчивость к эволюции схем.

  • DuckDB как встроенная аналитическая база позволяет строить быстрые, локальные и повторяемые пайплайны без промежуточной передачи данных между системами.

  • Вложенные типы Parquet требуют внимания к деталям: доступ к полям, предельная точность типов и корректная агрегация по намеченным полям.

     

FAQ

  1. Как DuckDB распределяет чтение Parquet между row groups и столбцами?

DuckDB использует статистику row groups и список столбцов в футере Parquet для определения того, какие части файла нужно прочитать. Фильтры в запросе могут ограничить читаемые row groups, а проекция столбцов заставляет reader загружать только те колонки, которые задействованы в вычислениях. Это обеспечивает эффективную пропускную загрузку и снижает потребление памяти.

 

  1. Что произойдет, если в Parquet-файле добавляются новые столбцы в процессе эволюции схемы?

DuckDB обрабатывает добавляемые столбцы как NULL-значения в тех файлах, где столбцы отсутствуют. Это обеспечивает совместимость без необходимости переразведения всех файлов. Если новая колонка появляется во всех файлах, она станет доступной в чтении, и запросы смогут ее использовать. В случае неоднородной структуры файлов может потребоваться согласование схемы на уровне пайплайна.

 

  1. Как работать с вложенными типами Parquet в DuckDB?

DuckDB отражает вложенные типы через структурированные столбцы и позволяет адресовать вложенные поля через точечную нотацию или соответствующие функции доступа. При этом следует помнить, что операции на вложенных полях могут потребовать дополнительных вычислений и конвертаций, поэтому план выполнения может стать более сложным.

 

  1. Можно ли писать Parquet прямо из DuckDB и какие гарантии целостности данные обеспечивают?

Да. Через операцию COPY ... TO 'путь' (FORMAT PARQUET) можно экспортировать результат вычислений в Parquet. DuckDB гарантирует корректность записи и сохранение типов, соответствующих выбранной схеме. При использовании внешних источников и разнообразных кодировок следует учитывать доступность параллелизма и совместимость версий Parquet в целевой среде.

 

  1. Какие практики помогают повысить производительность при работе с большими наборами Parquet?

Ограничивайте выборку до нужных столбцов (проекция), применяйте фильтры до чтения (pushdown), избегайте чтения лишних row groups, учитывайте статистику Parquet, и по возможности используйте параллелизм в выполнении запросов. Также предпочтительно держать стабильную схему и избегать частой эволюции, чтобы исключить дополнительную обработку на этапе импорта.

 

  1. Как DuckDB обрабатывает несовпадение типов между Parquet и внутренними типами?

DuckDB применяет сопоставление типов, но иногда может потребоваться явная конвертация или явное приведение типов в SQL. При необходимости можно привести столбцы к целевым типам в выражении SELECT, чтобы сохранить точность и ожидаемую семантику вычислений.

 

  1. Какие ограничения следует учитывать при чтении Parquet с внешних источников (S3, HTTP) из DuckDB?

Для чтения из внешних источников DuckDB использует расширения (например, httpfs) и конфигурацию доступа к хранилищам. Важно обеспечить корректную аутентификацию и сетевые настройки, а также учитывать задержки сети и стоимость доступа к данным. Производительность может зависеть от скорости соединения и размера файлов.

 

  1. Можно ли сочетать чтение Parquet и анализ в рамках одной сессии DuckDB?

Да. DuckDB позволяет загружать Parquet-файлы, выполнять агрегации и трансформации, а затем экспортировать результаты обратно в Parquet - в рамках одной сессии и одного процесса. Это упрощает создание локальных витрин и повторяемых аналитических пайплайнов.

 

  1. Как определить, какие столбцы и row groups используются в конкретном запросе?

Для анализа плана выполнения DuckDB предоставляет объяснение запроса, где можно увидеть примененные фильтры, соответствие столбцов и участие конкретных row groups. Включение режима подробной трассировки выполнения помогает понять, какие данные читались и какие операции применялись.

 

  1. Какие альтернативы Parquet существуют и когда их использовать в DuckDB?

Parquet остается основным и хорошо поддерживаемым форматом для аналитики из-за своей скорости, компрессии и поддержки schema evolution. В некоторых сценариях целесообразно использовать ORC или CSV/JSON в качестве промежуточного формата, например, для совместимости с конкретными конвейерами данных. Однако для типичных аналитических пайплайнов на локальной машине Parquet в DuckDB предоставляет лучший баланс между производительностью и удобством.

 

← Предыдущая статья
Расширяемость: UDFs, встроенные функции и механизмы расширений
Следующая статья →
Интеграция Parquet: фильтрация на чтении, статистика файлов и pushdown

 

Узнать стоимость решенияЗапросить видео презентацию

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • «Балтийский лизинг» — первая компания в России, получившая лицензию № 0001 от Министерства экономики РФ на лизинговую деятельность, лицензия зарегистрирована 2 сентября 1996 года. «Балтийский лизинг» работает на российском рынке 33 года: компания представлена 79 филиалами по всей стране, сегодня в штате более 1300 сотрудников. За последние десять лет компания профинансировала имущество для 80 000 клиентов.

  • Авиакомпания NordStar (АО «АК «НордСтар») – работает под данным брендом с 2008 г. и сейчас входит в топ-15 крупнейших российских авиакомпаний (данные Росавиации) с пассажирооборотом более 1 млн человек в год. АО «АК «НордСтар» выполняет и внутренние, и внешние рейсы, а ее основные хабы - Домодедово, Пулково и Емельяново. С 2021 года компания является базовым перевозчиком аэропорта Норильск.

  • Группа компаний «Галакс» ведет свою деятельность с 2005 года, являясь в те годы дистрибьютором известных международных марок в ряде крупнейших торговых сетей России в сегменте аудио и видео аксессуаров. Активно работая в этом направлении и приобретая ценный опыт, начали создавать собственные торговые марки «GAL» и «VIXTER»

  • KERAMA MARAZZI — международный бренд, входящий в число лидеров глобального рынка керамики. Бизнес компании охватывает весь процесс создания керамических изделий, от глиняных карьеров до фирменной розницы во всех крупных городах РФ и за рубежом.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.