fix(dags): сделать учебные сценарии воспроизводимыми
Управляемые ветки и ошибки, зависимости общих обработчиков, сохранение SQL-результата и фактическое чтение результатов Extract. Добавлен пример пулов и XCom; DQ-сводка сохраняет отказ при all_done. Проверено на Airflow 2.9.2: импорт и запуск девяти исходных DAG, выбор веток, повтор и окончательные отказы обеих рабочих задач, отрицательный DQ-сценарий и восстановление, фильтрация Extract и ожидание слотов.
This commit is contained in:
1 parent
623d5861c1
commit
cf1b770a65
6 files changed
+225
-211
No files matched your search
@@ -2,7 +2,7 @@
|
||||
DAG для проверки качества данных (Data Quality) после загрузки в PostgreSQL
|
||||
Уровень: Средний
|
||||
|
||||
Этот DAG запускается после csv_to_postgres и проверяет таблицу public.orders:
|
||||
Запустите этот DAG вручную после csv_to_postgres. Он проверяет public.orders:
|
||||
1. Существование таблицы
|
||||
2. Соответствие схемы (колонки и типы данных)
|
||||
3. Наличие данных (таблица не пуста)
|
||||
@@ -14,12 +14,11 @@ DAG для проверки качества данных (Data Quality) пос
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from airflow.operators.python import PythonOperator
|
||||
from airflow.providers.postgres.hooks.postgres import PostgresHook
|
||||
from datetime import datetime
|
||||
|
||||
from airflow import DAG
|
||||
from airflow.operators.python import PythonOperator
|
||||
from airflow.providers.postgres.hooks.postgres import PostgresHook
|
||||
|
||||
POSTGRES_CONN_ID = "postgres_training"
|
||||
|
||||
@@ -106,13 +105,20 @@ def _check_no_duplicates():
|
||||
conn.close()
|
||||
|
||||
|
||||
def _log_dq_summary():
|
||||
"""Логирует итоговую сводку по качеству данных."""
|
||||
logging.info("Все проверки качества данных пройдены успешно!")
|
||||
logging.info("Качество данных в таблице orders соответствует требованиям.")
|
||||
def _log_dq_summary(dag_run, ti):
|
||||
"""Проверяет итог, в том числе при учебном переходе на all_done."""
|
||||
states = {
|
||||
task.task_id: task.state
|
||||
for task in dag_run.get_task_instances()
|
||||
if task.task_id != ti.task_id
|
||||
}
|
||||
logging.info("Результаты проверок: %s", states)
|
||||
if any(state != "success" for state in states.values()):
|
||||
raise ValueError("Не все проверки качества данных прошли успешно")
|
||||
logging.info("Все проверки качества данных пройдены")
|
||||
|
||||
|
||||
default_args = {"owner": "airflow", "retries": 1, "retry_delay": timedelta(seconds=30)}
|
||||
default_args = {"owner": "student", "retries": 0}
|
||||
|
||||
with DAG(
|
||||
dag_id="csv_to_postgres_dq",
|
||||
|
||||
Reference in new issue
Block a user