Вступить в клуб →
сложнаявопросSQL и витрины данных

Инкрементальная витрина и опоздавшие события из мобильного приложения

Витрина daily_metrics пересчитывается каждый час: из сырого слоя забираются события с event_time больше максимального event_time, уже загруженного в витрину, и добавляются к результату.

Мобильное приложение копит события в оффлайне и отправляет их при следующем запуске — иногда через сутки-двое. Через месяц оказалось, что вчерашние цифры на дашборде стабильно ниже, чем при ручном пересчёте того же дня неделю спустя.

В чём причина и как правильно построить загрузку?

  • Достаточно поменять строгое сравнение на нестрогое (>= вместо >): сейчас теряются события ровно на границе последней загрузки — те, у которых event_time совпал с максимальным уже загруженным, и после правки инкремент начнёт захватывать все опоздавшие строки
  • Опоздавшие события приходят после того, как их день уже посчитан, и в витрину не попадают. Загрузку строят идемпотентной: отбор по времени поступления в сырой слой и полная перезапись партиций за последние N дней вместо дозаписи
  • Проблема в частоте запуска: при переходе на суточный расчёт все события успевают дойти, и расхождение исчезнет само
  • Источник надо сортировать по event_time перед вставкой, тогда опоздавшие события встанут в свой день и цифры сойдутся

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела