Выбор ответа Middle SQL дата-инженера спрашивают часто обновлено

Идемпотентный пересчёт агрегатов

Вопрос

Ежедневная задача дописывает в daily_revenue агрегаты за вчера через INSERT ... SELECT. После ретрая задачи суммы за день задвоились. Как сделать правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Перезаписывать период: в одной транзакции удалить строки дня и вставить заново, или upsert. Идемпотентность значит, что повтор даёт тот же результат.

Варианты ответа

  1. Запретить ретраи задачи в Airflow, чтобы вставка за день выполнялась строго один раз
  2. Перезаписывать период: в одной транзакции удалить строки дня и вставить заново, или upsertправильный ответ
  3. Добавить DISTINCT в отчёты поверх таблицы, чтобы дубли строк за день не суммировались
  4. Перед вставкой проверять, что таблица пустая, и пропускать вставку, если в ней уже есть строки

Разбор

Идемпотентность значит, что повтор даёт тот же результат. Перезапись партиции дня (DELETE и INSERT в транзакции, INSERT ... ON CONFLICT DO UPDATE или замена партиции) это обеспечивает. Запрет ретраев лишает пайплайн устойчивости к сбоям. DISTINCT в отчётах маскирует проблему и не спасает от разных сумм. Проверка на пустоту всей таблицы бессмысленна.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.