Блок подходит к концу, и пора собрать всё вместе. Каждую ночь приложение «Гонца» кладёт в озеро сырую выгрузку заказов за день. К утру Отто должен видеть витрину: сколько заказов было в каждой зоне и какая доля опоздала. Между выгрузкой и витриной работает Spark, а запускает его Airflow. Сегодня построим этот путь целиком и посмотрим, где Spark стоит в карте инструментов данных.
Слои озера
Данные в озере обычно лежат слоями, как товар на складе: приёмка, полки, витрина магазина.
- Сырой слой (
raw): файлы как пришли, со всеми дублями и мусором. Его не трогают, чтобы всегда можно было пересчитать всё с начала. - Очищенный слой (
cleanилиsilver): типы проверены, дубли убраны, пояса времени приведены, битые строки отброшены или отложены. - Витрины (
martsилиgold): агрегаты под конкретные вопросы, которые читают дашборды.
Вы уже видели эту идею в уроке про слои dbt: там слои живут в хранилище, здесь в озере. Spark делает переходы между слоями там, где данных слишком много для хранилища или где они ещё не таблицы.
Пайплайн «Гонца»
Скрипт ниже делает весь путь за одну ночь:
- Читает сырую выгрузку с явной схемой, как в уроке про DataFrame.
- Чистит: убирает дубли заказов, отбрасывает строки без зоны и цены, вычисляет опоздание с поправкой на пояс.
- Соединяет с маленьким справочником зон через broadcast.
- Считает витрину по дню и зоне.
- Пишет её в Parquet по папкам дней с перезаписью: повторный запуск за тот же день заменит его, а не задвоит. Это та же идемпотентность, что в уроке про Airflow.
Из 411 сырых строк осталось 408: одна строка была дублем, у одной цена «n/a», у одной пустая зона. Хуже всех 30 июня «Сортировка»: 20 опозданий из 24 заказов, 83%. Это та зона, где курьеров мало, и Отто видел это в каждом блоке курса.
В Spark UI четыре задания: два count() для контроля, запись и чтение витрины для проверки. В задании записи видно всё, что мы прошли: стадию broadcast со справочником зон, SortAggregate от dropDuplicates и HashAggregate витрины.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.