Выбор ответа Middle ETL, ELT и Airflow спрашивают часто обновлено

Почему нельзя брать вчера через now()

Вопрос

Задача считает период как datetime.now() - timedelta(days=1). Чем это плохо?

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

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

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

Коротко

Правильный ответ: При ретрае на следующий день или бэкфилле задача возьмёт не свой период; нужен datainterval. Период должен определяться запуском, а не временем выполнения.

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

  1. Ничем: это стандартный подход, Airflow подставляет время запуска в datetime.now() при ретраях
  2. datetime.now() в задачах Airflow запрещён и вызывает ошибку валидации DAG при разборе файла
  3. При ретрае на следующий день или бэкфилле задача возьмёт не свой период; нужен data_interval_*правильный ответ
  4. Это медленнее, чем брать дату из XCom, потому что каждый вызов обращается к метабазе

Разбор

Период должен определяться запуском, а не временем выполнения. Иначе перезапуск упавшей задачи через два дня посчитает другой день, а бэкфилл за прошлый месяц будет считать вчерашний день много раз. Ошибки Airflow не выдаст, именно поэтому баг коварный. Скорость тут ни при чём.

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

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