Capstone: проектирование аналитического движка
На протяжении курса вы изучали DataFusion послойно: от Arrow-формата (модуль 1) через архитектуру движка (модуль 2) до распределённого выполнения (модуль 8). В этом модуле вы соберёте знания воедино, спроектировав и реализовав мини аналитический движок.
Задание
Построить аналитическую систему на DataFusion Python, которая:
- Загружает данные из Parquet-файлов (arrow-формат на диске --- модуль 1)
- Регистрирует пользовательские функции (UDF/UDAF --- модуль 4)
- Выполняет SQL-запросы и DataFrame-операции (модуль 3 и модуль 4)
- Генерирует отчёты в Parquet-формате
- Использует расширяемость DataFusion (кастомные источники --- модуль 5)
Контекст: почему DataFusion Python
В модуле 4 вы освоили Python-биндинги DataFusion. Для capstone-проекта Python --- оптимальный выбор:
- Быстрый прототип: Python позволяет итерировать без компиляции Rust
- Тот же движок: Python API вызывает тот же Rust-код через PyO3 --- производительность на уровне нативного DataFusion
- Готовая экосистема: PyArrow, Pandas, Parquet --- всё доступно из pip
Capstone-проект не требует знания Rust. Все упражнения выполняются на DataFusion Python, который вы изучали в модуле 4.
Спецификация требований
Данные
Система работает с двумя Parquet-файлами:
10 000 записей о продажах и 200 продуктов в 5 категориях. Данные генерируются при сборке Docker-образа (скрипт generate_data.py).
Функциональные требования
| Требование | Описание | Модуль курса |
|---|---|---|
| FR-1 | Автоматическая регистрация Parquet-файлов как таблиц | M04: register_parquet |
| FR-2 | Скалярный UDF для классификации выручки | M04: udf() |
| FR-3 | Агрегатный UDAF для средневзвешенного значения | M04: Accumulator |
| FR-4 | SQL-аналитика: сводки, группировки, сортировки | M03: SQL API |
| FR-5 | DataFrame-аналитика: фильтрация, агрегация | M04: DataFrame API |
| FR-6 | Экспорт отчётов в Parquet | M01: Parquet формат |
Архитектура
Движок состоит из четырёх слоёв:
-
DataLoader --- регистрирует файлы данных как таблицы в SessionContext. Аналог каталога в полноценных системах (модуль 5 --- кастомные TableProvider).
-
UDF Registry --- регистрирует бизнес-функции. В промышленных системах это часть плагин-архитектуры (модуль 5 --- кастомные функции).
-
Query Layer --- SQL и DataFrame API для аналитических запросов. DataFusion транслирует оба интерфейса в один LogicalPlan (модуль 2).
-
Report Generator --- сохраняет результаты в Parquet. В production-системах этот слой отправляет данные в объектное хранилище или Flight-сервис (модуль 4).
Подготовка к лабораторной
Развёртывание среды
Лабораторные файлы находятся в labs/capstone/. Для запуска Docker-среды:
cd labs/capstone
docker compose up -d --build
docker compose exec lab bash
Структура упражнений
Три упражнения с нарастающей сложностью:
| Упражнение | Файл | Цель |
|---|---|---|
| 1. Исследование данных | exercises/01_explore_data.py | Чтение Parquet, SQL, DataFrame API |
| 2. Пользовательские функции | exercises/02_custom_udf.py | UDF, UDAF, комбинированные запросы |
| 3. Аналитический движок | exercises/03_analytics_engine.py | Полный конвейер: загрузка, UDF, аналитика, отчёты |
Каждое упражнение содержит блоки TODO с подсказками. Раскомментируйте код и дополните реализацию.
Начните с упражнения 1 --- оно закрепляет базовые операции из модуля 4. Упражнение 3 объединяет всё в единый движок.
Самопроверка перед лабораторной
Перед тем как перейти к практике, убедитесь, что вы помните ключевые концепции:
-
SessionContext --- точка входа в DataFusion Python. Создаётся один раз, используется для регистрации данных и выполнения запросов. Подробно --- урок 4.1.
-
register_parquet --- регистрирует файл как таблицу. После регистрации файл доступен по имени в SQL-запросах. Подробно --- урок 4.1.
-
udf() --- создаёт скалярную пользовательскую функцию. Принимает Python-функцию, типы аргументов, тип результата и volatility. Подробно --- урок 4.4.
-
Accumulator --- базовый класс для UDAF. Реализует
state(),update(),merge(),evaluate(). Подробно --- урок 4.4. -
write_parquet --- сохраняет DataFrame в Parquet-файл. Подробно --- урок 4.2.
Итоги
В этом уроке вы получили:
- Постановку capstone-задачи --- мини аналитический движок на DataFusion Python
- Спецификацию данных и функциональных требований
- Архитектуру системы с чёткими слоями
- Подготовку Docker-среды для лабораторной работы
В следующем уроке переходим к практике --- реализуем движок в Docker-лаборатории.