Выбор ответа Middle ETL, ELT и Airflow спрашивают часто обновлено
Почему нельзя брать вчера через now()
Вопрос
Задача считает период как datetime.now() - timedelta(days=1). Чем это плохо?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При ретрае на следующий день или бэкфилле задача возьмёт не свой период; нужен datainterval. Период должен определяться запуском, а не временем выполнения.
Варианты ответа
- Ничем: это стандартный подход, Airflow подставляет время запуска в
datetime.now()при ретраях datetime.now()в задачах Airflow запрещён и вызывает ошибку валидации DAG при разборе файла- При ретрае на следующий день или бэкфилле задача возьмёт не свой период; нужен
data_interval_*правильный ответ - Это медленнее, чем брать дату из XCom, потому что каждый вызов обращается к метабазе
Разбор
Период должен определяться запуском, а не временем выполнения. Иначе перезапуск упавшей задачи через два дня посчитает другой день, а бэкфилл за прошлый месяц будет считать вчерашний день много раз. Ошибки Airflow не выдаст, именно поэтому баг коварный. Скорость тут ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.