Как работать с неполными данными из разных серверов и таблиц?
Что проверяют
Отличаете ли вы пропуск в колонке от пропуска на уровне интеграции: не приехавшие строки, ключи, которые не сходятся между системами, опоздавшие данные. Интервьюеру важно, чтобы вы сначала нашли, где и почему теряются данные, а уже потом заполняли дыры. Следом часто спрашивают, как узнать о проблеме раньше, чем её увидит заказчик отчёта.
Как отвечать
Идите от диагностики к обработке:
- сверка с источником: число строк и контрольные суммы по дням в источнике и в хранилище. Расхождение сразу показывает, где пропала загрузка;
- ключи соединения: разные типы и форматы одного идентификатора, ведущие нули, регистр, пробелы, часовые пояса в датах. Ключи нормализуют до
JOIN, а долю строк без пары считают через anti-join; - дубли и приоритет источников: последнюю версию записи выбирают через
ROW_NUMBER() OVER (PARTITION BY key ORDER BY updated_at DESC), а при конфликте значений задают, какой системе верить, и собирают итог черезCOALESCEв этом порядке; - опоздавшие данные: инкрементальная загрузка с запасом по времени и идемпотентной перезаписью окна, чтобы повторный запуск не плодил дубли;
- проверки качества: тесты dbt (
not_null,unique,relationships) или Great Expectations прямо в конвейере, с остановкой загрузки при нарушении.
Оставшиеся пропуски для модели разберите по механизму: случайные (MCAR), зависящие от других признаков (MAR) или от самого значения (MNAR). От этого зависит, удалять, заполнять или добавлять признак-индикатор пропуска. Заполнение обучается только на обучающей выборке, внутри Pipeline.
Где спотыкаются
Сразу берут SimpleImputer и заливают средним всё, что не сошлось после JOIN. Часть «пропусков» оказывается несопоставленными ключами, и модель учится на мусоре.
Используют INNER JOIN и молча теряют строки без пары во второй таблице. Потерю никто не замечает, пока цифры отчёта не разойдутся с источником.
Считают среднее для заполнения по всему датасету до разбиения на обучение и тест. Из-за утечки оценка качества получается завышенной.