Раздел 26 · Data Engineering

Качество данных и валидация

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке загрузка «Гонца» научилась переживать повторы. Но она честно загружает и мусор. В рабочей базе приложения за четыре месяца нашлось 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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.