В прошлом уроке загрузка «Гонца» научилась переживать повторы. Но она честно загружает и мусор. В рабочей базе приложения за четыре месяца нашлось 29 доставленных заказов без времени доставки, 17 отменённых, у которых время доставки почему-то есть, и 24 доставки, которые закончились раньше, чем курьер забрал заказ. Каждый такой заказ ломает среднее время доставки на дашборде Отто. А однажды приложение пришлёт пустой файл, и пайплайн бодро загрузит ноль заказов, и в отчёте «Гонец» за вчера ничего не заработает.
Входной контроль
На заводе, который делает табуретки, доски проверяют на входе: нет ли трещин, нужной ли длины, не сырые ли. Кривую доску отправляют назад поставщику, а не в цех. Потому что, если её пропустить, табуретка развалится уже у покупателя, и разбираться придётся гораздо дольше.
Пайплайну нужен такой же входной контроль. Проверка ставится между выгрузкой и загрузкой, и если данные кривые, они не доезжают до хранилища.
Что проверять
Качество данных раскладывают на несколько свойств. У каждого своя проверка:
| Свойство | Вопрос | Проверка для заказов «Гонца» |
|---|---|---|
| Полнота | всё ли доехало? | за день есть заказы, их примерно столько же, сколько обычно |
| Уникальность | нет ли дублей? | номер заказа не повторяется |
| Допустимость | значения из разумного диапазона? | цена больше нуля, статус delivered или cancelled |
| Согласованность | поля не противоречат друг другу? | у доставленного есть время доставки, у отменённого нет |
| Свежесть | данные не устарели? | самый свежий заказ не старше суток |
Проверки пишутся обычным SQL или Python. Вот как найти все три вида битых заказов в рабочей базе:
SELECT count(*) FILTER (WHERE status = 'delivered' AND delivered_at IS NULL) AS delivered_without_time,
count(*) FILTER (WHERE status = 'cancelled' AND delivered_at IS NOT NULL) AS cancelled_with_time,
count(*) FILTER (WHERE delivered_at < picked_up_at) AS delivered_before_pickup
FROM orders;
Этот запрос на базе «Гонца» возвращает 29, 17 и 24.
Остановить или предупредить
Не каждая проблема стоит того, чтобы ронять пайплайн. Проверки делят по строгости:
- блокирующие: без них данные врут. Пустой день, дубли, отменённый заказ с временем доставки. Пайплайн падает, витрина не обновляется, дашборд показывает вчерашние, но правильные цифры;
- предупреждающие: странно, но жить можно. Заказов на 30% меньше обычного, но это воскресенье. Пайплайн идёт дальше, а дежурному приходит сообщение.
Иногда плохие строки не выбрасывают, а откладывают в отдельную таблицу, карантин: основной поток идёт дальше без них, а кто-то потом разбирает отложенное руками.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.