End-to-end конвейер обработки данных из датасета "NYC Taxi & Limousine Commission" на базе Airflow + dbt + Superset. Тестовое задание для трудоустройства в ООО «РХИТ».
Каждый раз при запуске проекта выполняются все этапы конвейера. После инициализации необходимых сервисов Airflow запускает требуемый в задаче DAG, который вначале осуществляет загрузку сырых данных в PostgreSQL из CSV-датасета (максимум 50000 строк). Они загружаются как есть: с сохранением заданных в датасете имён столбцов и в текстовом виде. Перед каждой загрузкой БД raw.nyc_taxi_trips очищается для обеспечения идемпотентности. В конце выводится количество строк в файле и количество загруженных строк.
Далее производится трансформация и тестирование данных с помощью dbt, установленного в контейнер Airflow как зависимость. Запускается слой staging, где из сырых данных отбираются нужные поля, приводятся к правильным типам и валидируются согласно ТЗ: отбрасываются записи с неуказанной датой поездки (trip_date), вместо отрицательных / нулевых значений прибыли (fare amount и total_amount) указывается null. Результат выполнения этого слоя сохраняется как представление stg.stg_nyc_taxi_trips.
На слое marts формируется таблица marts.mart_taxi_daily, используемая для аналитики и содержащая агрегированные по датам поездок данные.
После обоих слоёв выполняются минимальные тесты на корректность: проверка уникальности идентификатора поездки (trip_id) и проверка на null полей суммы выручки (revenue_sum) и даты поездки (trip_date).
Параллельно с выполнением DAG производится импорт заранее подготовленного дашборда в Superset, уже подключённого к базе данных PostgreSQL. Подключение осуществляется по стандартным данным PostgreSQL, указанным в .env.example. При экспорте они остаются захардкоженными, поэтому если вы их измените, дашборд не сможет подключиться корректно. Исключение составляет пароль, который подхватывается при каждом новом запуске динамически. После выполнения DAG на нём можно будет посмотреть отображены графики выручки и числа поездок по дням за октябрь — декабрь 2017.
- Apache Airflow — фреймворк для оркестрации процессов
- PostgreSQL — хранилище данных
- dbt — фреймворк для трансформации и контроля качества данных
- Apache Superset — инструмент визуализации
- Python — язык программирования
- uv — пакетный менеджер
- Ruff — инструмент для форматирования и анализа кода
- Pyright — статический типизатор
- pre-commit — фреймворк для настройки хуков Git
- Клонируйте репозиторий и перейдите в его папку.
- Создайте файл
.envна основе .env.example и при необходимости измените указанные там параметры. - Установите Docker.
- Теперь запускать проект можно командой:
docker compose up -d --buildТеперь Airflow будет доступен по адресу http://localhost:8080/, а Superset — http://localhost:8088. К БД PostgreSQL можно подключиться на localhost:5432. Логины и пароли для входа заданы в .env.
Чтобы модифицировать проект, установите пакетный менеджер uv одним из способов. Например, для Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Далее необходимо установить зависимости:
uv sync
pre-commit install # эту и последующие команды выполнять после активации venv Чтобы обновить датасет, нужно выполнить команду:
uv run -m data.loaderДля запуска трансформаций и тестов dbt, запустите PostgreSQL, раскомментируйте переменную POSTGRES_HOST в .env и выполните команды:
cd dbt
dbt run --profiles-dir . --select stg_nyc_taxi_trips
dbt test --profiles-dir . --select stg_nyc_taxi_trips
dbt run --profiles-dir . --select marts_nyc_taxi_trips
dbt test --profiles-dir . --select marts_nyc_taxi_trips Запустить форматирование кода, его линтинг и статический анализ типов (эти операции выполняются автоматически при коммитах) можно следующими командами соответственно:
ruff format
ruff check --fix
pyright