Выбор ответа Middle SQL дата-инженера спрашивают часто обновлено
Идемпотентный пересчёт агрегатов
Вопрос
Ежедневная задача дописывает в daily_revenue агрегаты за вчера через INSERT ... SELECT. После ретрая задачи суммы за день задвоились. Как сделать правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Перезаписывать период: в одной транзакции удалить строки дня и вставить заново, или upsert. Идемпотентность значит, что повтор даёт тот же результат.
Варианты ответа
- Запретить ретраи задачи в Airflow, чтобы вставка за день выполнялась строго один раз
- Перезаписывать период: в одной транзакции удалить строки дня и вставить заново, или upsertправильный ответ
- Добавить
DISTINCTв отчёты поверх таблицы, чтобы дубли строк за день не суммировались - Перед вставкой проверять, что таблица пустая, и пропускать вставку, если в ней уже есть строки
Разбор
Идемпотентность значит, что повтор даёт тот же результат. Перезапись партиции дня (DELETE и INSERT в транзакции, INSERT ... ON CONFLICT DO UPDATE или замена партиции) это обеспечивает. Запрет ретраев лишает пайплайн устойчивости к сбоям. DISTINCT в отчётах маскирует проблему и не спасает от разных сумм. Проверка на пустоту всей таблицы бессмысленна.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.