ke2-airflow-commons


Nameke2-airflow-commons JSON
Version 0.1.0 PyPI version JSON
download
home_page
SummaryPython package framework to work with Apache Airflow developed in KazanExpress Data Office
upload_time2023-05-18 20:31:52
maintainer
docs_urlNone
authorYour Name
requires_python>=3.9,<4.0
license
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Airflow-commons

Airflow-commons - проект, который включает в себя вспомогательные инструменты для Apache Airflow, позволяющие быстро создавать даги.

## Оглавление
 - [Структура проекта](#structure)
 - [Операторы](#operators)
 - [Хуки](#hooks)
 - [Вспомогательные методы](#helpers)

## <a name="structure">Структура проекта</a>
<img width="1041" alt="image" src="https://user-images.githubusercontent.com/23666121/192269840-f64eabba-842a-44fd-9148-8c62601db04b.png">

## <a name="operators">Операторы</a>

<a name="ClickhouseExecuteOperator">`ClickhouseExecuteOperator`</a> - оператор, позволяющий выполнять SQL запрос в распределенной базе данных `Clickhouse`.
Аргументы:
 - `sql` - SQL запрос для выполнения в Clickhouse. Можно передать как сам запрос, так и путь до запроса
 - `ch_hook` - экземпляр класса ClickhouseHook
 - `query_id` (Необязательный) - [uuid запроса](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), переданный в Clickhouse. Не нужно указывать в большинстве случаев, Clickhouse сгенерирует его сам.
 - `partitions_to_optimize` (Необязательнный) - список кортежей типа (таблица, партиция). В качестве примера - `[('marts.order_items', "{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}")]`
 - `external_tables` (Необязательнный) - список словарей, позволяющий передать в запрос какие то [дополнительные данные](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)
 
`FileToClickhouseOperator` - оператор, позволяющий содержимое файла вставить в таблицу в Clickhouse.
Аргументы:
 - `ch_hook` - экземпляр класса ClickhouseHook
 - `target_table` - название таблицы, в которую будут вставляться данные. **Указывается без схемы, поскольку схема указывается в хуке**
 - `filename` - наименование файла, содержимого которого необходимо считать
 - `filepath` (Необязательный) - путь к файлу, содержимое которого необходимо считать. По умолчанию значение - `'/opt/airflow/s3fs/{{ dag.dag_id }}/{{ run_id }}'`
 - `column_list` (Необязательный): кортеж с наименованиями столбцов. По умолчанию вставка происходит во все колонки таблицы
 - `truncate` (Необязательный): флаг, позволяющий перед вставкой выполнить процедуру `TRUNCATE`. **Использовать в _КРАЙНИХ_ случаях**
 - `transform_df` (Необязательный): метод, принимающий `pd.DataFrame` и `context` (Airflow) и возвращающий `pd.DataFrame`. Используется в случае, если есть необходимость преобразовать датафрейм полученный из файла 
 - `query_id` (Необязательный) - [uuid запроса](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), переданный в Clickhouse. Не нужно указывать в большинстве случаев, Clickhouse сгенерирует его сам.
 - `partitions_to_optimize` (Необязательнный) - список кортежей типа (таблица, партиция). В качестве примера - `[('marts.order_items', "{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}")]`
 - `external_tables` (Необязательнный) - список словарей, позволяющий передать в запрос какие то [дополнительные данные](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)
 - `pd_read_csv_kwargs` (Необязательнный) - словарь с параметрами для передачи в [метод `pd.read_csv`](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas-read-csv). По умолчанию передается только `{'encoding': 'UTF-8'}`
 - `pd_read_parquet_kwargs` (Необязательнный) - словарь с параметрами для передачи в [метод `pd.read_parquet`](https://pandas.pydata.org/docs/reference/api/pandas.read_parquet.html).
 
`SQLToFileOperator` - оператор, позволяющий сохранить результат SQL запроса в файловую систему. 
Аргументы:
 - `sql` - SQL запрос для выполнения в Clickhouse. Можно передать как сам запрос, так и путь до запроса
 - `filename` - наименование файла для сохранения
 - `db_hook` - экземпляр класса ClickhouseHook или [PostgresHook](https://airflow.apache.org/docs/apache-airflow-providers-postgres/stable/_api/airflow/providers/postgres/hooks/postgres/index.html#airflow.providers.postgres.hooks.postgres.PostgresHook)
 - `filepath` (Необязательный) - путь к файлу для сохранения. По умолчанию значение - `'/opt/airflow/s3fs/{{ dag.dag_id }}/{{ run_id }}'`
 - `pd_to_csv_kwargs` (Необязательнный) - словарь с параметрами для передачи в [метод `pd.to_csv`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html#pandas-dataframe-to-csv). По умолчанию передается пустой словарь
 - `pd_to_parquet_kwargs` (Необязательнный) - словарь с параметрами для передачи в [метод `pd.to_parquet`](https://pandas.pydata.org/pandas-docs/version/1.1/reference/api/pandas.DataFrame.to_parquet.html). По умолчанию передается пустой словарь
 
`PostgresToClickhouseOperator` - оператор, позволяющий выполнить SQL запрос в бд PostgreSQL и вставить в таблицу в Clickhouse.
Аргументы:
 - `sql` - SQL запрос для выполнения в PostgreSQL. Можно передать как сам запрос, так и путь до запроса
 - `clickhouse_hook` - экземпляр класса ClickhouseHook
 - `postgresql_hook` - экземпляр класса PostgresHook
 - `clickhouse_table` - название таблицы, в которую будут вставляться данные. **Указывается без схемы, поскольку схема указывается в хуке**
 - `column_list` (Необязательный): кортеж с наименованиями столбцов. По умолчанию вставка происходит во все колонки таблицы
 - `truncate` (Необязательный): флаг, позволяющий перед вставкой выполнить процедуру `TRUNCATE`. **Использовать в _КРАЙНИХ_ случаях**
 - `query_id` (Необязательный) - [uuid запроса](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), переданный в Clickhouse. Не нужно указывать в большинстве случаев, Clickhouse сгенерирует его сам.
 - `partitions_to_optimize` (Необязательнный) - список кортежей типа (таблица, партиция). В качестве примера - `[('marts.order_items', "{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}")]`
 - `external_tables` (Необязательнный) - список словарей, позволяющий передать в запрос какие то [дополнительные данные](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)
 
`ODDSQLCheckDQTestOperator` - оператор, позволяющий создавать Data Quality тесты в ODD. На данный момент поддерживается проверка только в рамках одной базы данных, можно делать простые проверки (null в колонке, ограничения на значения, проверка дубликатов и тд.)
Аргументы:
 - `dataset_oddrn` - oddrn датасета, качество которого будет проверяться
 - `extract_sql` - SQL запрос для выполнения в бд. Можно передать как сам запрос, так и путь до запроса
 - `db_conn_id` - наименование подключения в Airflow.
 - `dq_tests` - список экземпляров класса `DQTest`
 - `odd_conn_id` - наименование подключения в Airflow для ODD
 - `db_conn_type` - тип подключения. Поддерживается PostgreSQL и Clickhouse
 - `linked_url_list` - список ссылок, связанных с тестами (ссылки на джиру, документации и тд.)

Класс `DQTest` - класс для создания теста на качество данных. Этот класс используется для наследования. Например создать класс `CheckIfExactValueDQT(DQTest)`, который переопределяет метод `test_data` и возвращает `DQTestResult`. Логику теста можно прописать любую, добавить аргументы в класс тоже можно
Аргументы:
 - `suite` - наименование группы тестов
 - `name` - наименование теста
Методы:
 - test_data - должен принимать `pd.DataFrame` и context (Airflow) и возвращать `DQTestResult`.
 
Класс `DQTestResult` - класс, предназначенный исключительно для создания экземпляра с переданными значениями
Аргументы:
 - `suite` -  наименование группы тестов, передается из класса `DQTest`
 - `name` - наименование теста, передается из класса `DQTest`
 - `status` - значение класса `DQTestStatus`
 - `reason` - описание результата теста для отображения в ODD
 - `expected` (Необязательный) - словарь с ожидаемыми значениями метрик 
 - `actual` (Необязательный) - словарь с реальными значениями метрик
 
Класс `DQTestStatus` - класс Enum, хранящий возможные статусы - `SUCCESS, FAILED, BROKEN`

`GSheetToClickhouseOperator` - оператор, который выгружает электронную таблицу Google Sheet в Clickhouse. Если таблица не существует, то она будет создана в первый раз (при `recreate = False (default)`). При каждом выполнении таблица очищается и происходит вставка полных данных. Помимо основной таблицы будет создана историчная таблица из 2 столбцов: даты вставки и json полных данных. Эта таблица поможет выявлять изменения, которые были внесены в Google Sheet. Оператор также передает в xcom json с данными (если они есть). 

Аргументы:
 - `spreadsheet_id` - идентификатор Google Sheet, который содержится в [url адресе](https://developers.google.com/sheets/api/guides/concepts). 
 - `sheet` - наименование страницы в Google Sheet, который необходимо вставить в Clickhouse
 - `hook` - экземпляр класса ClickhouseHook
 - `table_name` - название таблицы, в которую будут вставляться данные. **Указывается без схемы, поскольку схема указывается в хуке**
 - `recreate` (Необязательный): boolean. Если указать True, то таблица будет создана заново - необходимо по большей части для контроля схемы. В случае частого изменения схемы, этот аргумент лучше указать.
 - `headers` (Необязательный): номер строки, содержащий названия колонок, по умолчанию 1. Отсчет идет от 1.
 - `google_auth_conn_id` (Необязательный) - Идентификатор подключения к Google, аргумент для получения сервисного аккаунта, заполнять не требуется.

## <a name="hooks">Хуки</a>

`ClickHouseHook` - хук для подключения к бд Clickhouse
Аргументы:
 - `clickhouse_conn_id` - наименование подключения в Airflow
 - `database` (Необязательный) - база данных для подключения (marts, search и тд.)
 - `settings` (Необязательный) - словарь с [настройками подключения](https://clickhouse-driver.readthedocs.io/en/latest/features.html#settings)
 - `use_numpy` (Необязательный) - флаг использования [библиотеки `numpy`](https://clickhouse-driver.readthedocs.io/en/latest/features.html#settings)

`ODDHook` - хук для подключения к ODD
Аргументы:
 - `odd_conn_id` - наименование подключения в Airflow
 
## <a name="helpers">Вспомогательные методы</a>

`Alert` - класс для отправки сообщений (алертов) в Slack или Telegram.
 - `context` - контекст Airflow
 - `receiver_type` - тип получателя алерта. Поддерживается Slack и Telegram
 - `conn_id` - наименование подключения в Airflow.
 - `message` (Необязательный) - дополнительные данные в алерт, по умолчанию сообщение уже сгенерировано
 - `channel` (Необязательный) - наименование или id канала
 
`send_alert_to_slack(context, connections = [])` - метод, который по умолчанию отправляет алерты в дефолтный канал слака, его можно просто импортировать и указать в параметр `on_failure_callback` дага (или таски). Можно переопределить метод, создав экземпляры класса `Alert` и вызвав для них метод `send()`

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "ke2-airflow-commons",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9,<4.0",
    "maintainer_email": "",
    "keywords": "",
    "author": "Your Name",
    "author_email": "you@example.com",
    "download_url": "",
    "platform": null,
    "description": "# Airflow-commons\n\nAirflow-commons - \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f Apache Airflow, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u0433\u0438.\n\n## \u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\n - [\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430](#structure)\n - [\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b](#operators)\n - [\u0425\u0443\u043a\u0438](#hooks)\n - [\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b](#helpers)\n\n## <a name=\"structure\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430</a>\n<img width=\"1041\" alt=\"image\" src=\"https://user-images.githubusercontent.com/23666121/192269840-f64eabba-842a-44fd-9148-8c62601db04b.png\">\n\n## <a name=\"operators\">\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b</a>\n\n<a name=\"ClickhouseExecuteOperator\">`ClickhouseExecuteOperator`</a> - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 `Clickhouse`.\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `sql` - SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 Clickhouse. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u0430\u043a \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n - `ch_hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 ClickhouseHook\n - `query_id` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - [uuid \u0437\u0430\u043f\u0440\u043e\u0441\u0430](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 Clickhouse. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, Clickhouse \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u0430\u043c.\n - `partitions_to_optimize` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0442\u0438\u043f\u0430 (\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 - `[('marts.order_items', \"{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}\")]`\n - `external_tables` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e [\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)\n \n`FileToClickhouseOperator` - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Clickhouse.\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `ch_hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 ClickhouseHook\n - `target_table` - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435. **\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0445\u0435\u043c\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0443\u043a\u0435**\n - `filename` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c\n - `filepath` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - `'/opt/airflow/s3fs/{{ dag.dag_id }}/{{ run_id }}'`\n - `column_list` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u0441\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n - `truncate` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u0444\u043b\u0430\u0433, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 `TRUNCATE`. **\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 _\u041a\u0420\u0410\u0419\u041d\u0418\u0425_ \u0441\u043b\u0443\u0447\u0430\u044f\u0445**\n - `transform_df` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u043c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 `pd.DataFrame` \u0438 `context` (Airflow) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 `pd.DataFrame`. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \n - `query_id` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - [uuid \u0437\u0430\u043f\u0440\u043e\u0441\u0430](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 Clickhouse. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, Clickhouse \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u0430\u043c.\n - `partitions_to_optimize` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0442\u0438\u043f\u0430 (\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 - `[('marts.order_items', \"{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}\")]`\n - `external_tables` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e [\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)\n - `pd_read_csv_kwargs` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 [\u043c\u0435\u0442\u043e\u0434 `pd.read_csv`](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas-read-csv). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e `{'encoding': 'UTF-8'}`\n - `pd_read_parquet_kwargs` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 [\u043c\u0435\u0442\u043e\u0434 `pd.read_parquet`](https://pandas.pydata.org/docs/reference/api/pandas.read_parquet.html).\n \n`SQLToFileOperator` - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `sql` - SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 Clickhouse. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u0430\u043a \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n - `filename` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\n - `db_hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 ClickhouseHook \u0438\u043b\u0438 [PostgresHook](https://airflow.apache.org/docs/apache-airflow-providers-postgres/stable/_api/airflow/providers/postgres/hooks/postgres/index.html#airflow.providers.postgres.hooks.postgres.PostgresHook)\n - `filepath` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - `'/opt/airflow/s3fs/{{ dag.dag_id }}/{{ run_id }}'`\n - `pd_to_csv_kwargs` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 [\u043c\u0435\u0442\u043e\u0434 `pd.to_csv`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html#pandas-dataframe-to-csv). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\n - `pd_to_parquet_kwargs` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 [\u043c\u0435\u0442\u043e\u0434 `pd.to_parquet`](https://pandas.pydata.org/pandas-docs/version/1.1/reference/api/pandas.DataFrame.to_parquet.html). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\n \n`PostgresToClickhouseOperator` - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0431\u0434 PostgreSQL \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Clickhouse.\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `sql` - SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 PostgreSQL. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u0430\u043a \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n - `clickhouse_hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 ClickhouseHook\n - `postgresql_hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 PostgresHook\n - `clickhouse_table` - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435. **\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0445\u0435\u043c\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0443\u043a\u0435**\n - `column_list` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u0441\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n - `truncate` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u0444\u043b\u0430\u0433, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 `TRUNCATE`. **\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 _\u041a\u0420\u0410\u0419\u041d\u0418\u0425_ \u0441\u043b\u0443\u0447\u0430\u044f\u0445**\n - `query_id` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - [uuid \u0437\u0430\u043f\u0440\u043e\u0441\u0430](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing), \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 Clickhouse. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, Clickhouse \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u0430\u043c.\n - `partitions_to_optimize` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0442\u0438\u043f\u0430 (\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 - `[('marts.order_items', \"{{ macros.ds_format(ds, '%Y-%m-%d', '%Y%m') }}\")]`\n - `external_tables` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043d\u044b\u0439) - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e [\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435](https://clickhouse-driver.readthedocs.io/en/latest/features.html#external-data-for-query-processing)\n \n`ODDSQLCheckDQTestOperator` - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Data Quality \u0442\u0435\u0441\u0442\u044b \u0432 ODD. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (null \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u0442\u0434.)\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `dataset_oddrn` - oddrn \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f\n - `extract_sql` - SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0434. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u0430\u043a \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n - `db_conn_id` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Airflow.\n - `dq_tests` - \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 `DQTest`\n - `odd_conn_id` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Airflow \u0434\u043b\u044f ODD\n - `db_conn_type` - \u0442\u0438\u043f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f PostgreSQL \u0438 Clickhouse\n - `linked_url_list` - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0436\u0438\u0440\u0443, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0442\u0434.)\n\n\u041a\u043b\u0430\u0441\u0441 `DQTest` - \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 `CheckIfExactValueDQT(DQTest)`, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 `test_data` \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 `DQTestResult`. \u041b\u043e\u0433\u0438\u043a\u0443 \u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043b\u0430\u0441\u0441 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `suite` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u0435\u0441\u0442\u043e\u0432\n - `name` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430\n\u041c\u0435\u0442\u043e\u0434\u044b:\n - test_data - \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c `pd.DataFrame` \u0438 context (Airflow) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c `DQTestResult`.\n \n\u041a\u043b\u0430\u0441\u0441 `DQTestResult` - \u043a\u043b\u0430\u0441\u0441, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `suite` -  \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 `DQTest`\n - `name` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 `DQTest`\n - `status` - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 `DQTestStatus`\n - `reason` - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 ODD\n - `expected` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a \n - `actual` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\n \n\u041a\u043b\u0430\u0441\u0441 `DQTestStatus` - \u043a\u043b\u0430\u0441\u0441 Enum, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b - `SUCCESS, FAILED, BROKEN`\n\n`GSheetToClickhouseOperator` - \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 Google Sheet \u0432 Clickhouse. \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 (\u043f\u0440\u0438 `recreate = False (default)`). \u041f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u043e\u043b\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437 2 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432: \u0434\u0430\u0442\u044b \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 json \u043f\u043e\u043b\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u0432 Google Sheet. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432 xcom json \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c). \n\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `spreadsheet_id` - \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 Google Sheet, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 [url \u0430\u0434\u0440\u0435\u0441\u0435](https://developers.google.com/sheets/api/guides/concepts). \n - `sheet` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 Google Sheet, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 Clickhouse\n - `hook` - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 ClickhouseHook\n - `table_name` - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435. **\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0445\u0435\u043c\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0443\u043a\u0435**\n - `recreate` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): boolean. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c True, \u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0437\u0430\u043d\u043e\u0432\u043e - \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u0445\u0435\u043c\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0430\u0441\u0442\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b, \u044d\u0442\u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043b\u0443\u0447\u0448\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c.\n - `headers` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439): \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1. \u041e\u0442\u0441\u0447\u0435\u0442 \u0438\u0434\u0435\u0442 \u043e\u0442 1.\n - `google_auth_conn_id` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Google, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n\n## <a name=\"hooks\">\u0425\u0443\u043a\u0438</a>\n\n`ClickHouseHook` - \u0445\u0443\u043a \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0434 Clickhouse\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `clickhouse_conn_id` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Airflow\n - `database` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (marts, search \u0438 \u0442\u0434.)\n - `settings` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 [\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f](https://clickhouse-driver.readthedocs.io/en/latest/features.html#settings)\n - `use_numpy` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0444\u043b\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f [\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 `numpy`](https://clickhouse-driver.readthedocs.io/en/latest/features.html#settings)\n\n`ODDHook` - \u0445\u0443\u043a \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a ODD\n\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n - `odd_conn_id` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Airflow\n \n## <a name=\"helpers\">\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b</a>\n\n`Alert` - \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0430\u043b\u0435\u0440\u0442\u043e\u0432) \u0432 Slack \u0438\u043b\u0438 Telegram.\n - `context` - \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Airflow\n - `receiver_type` - \u0442\u0438\u043f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0430\u043b\u0435\u0440\u0442\u0430. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f Slack \u0438 Telegram\n - `conn_id` - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Airflow.\n - `message` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0430\u043b\u0435\u0440\u0442, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\n - `channel` (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439) - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 id \u043a\u0430\u043d\u0430\u043b\u0430\n \n`send_alert_to_slack(context, connections = [])` - \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043b\u0435\u0440\u0442\u044b \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0441\u043b\u0430\u043a\u0430, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 `on_failure_callback` \u0434\u0430\u0433\u0430 (\u0438\u043b\u0438 \u0442\u0430\u0441\u043a\u0438). \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u0441\u043e\u0437\u0434\u0430\u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 `Alert` \u0438 \u0432\u044b\u0437\u0432\u0430\u0432 \u0434\u043b\u044f \u043d\u0438\u0445 \u043c\u0435\u0442\u043e\u0434 `send()`\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Python package framework to work with Apache Airflow developed in KazanExpress Data Office",
    "version": "0.1.0",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6356ac71de3755cc73efb7e1ad37215d5f26b25e30a9ae157579070470631516",
                "md5": "ee6f2a2dc0e759a4ef197496ff619f6e",
                "sha256": "8cfe07d583911975f05d68f2039c2da6c44bc0355c1f3c5c3729e04c25c6b397"
            },
            "downloads": -1,
            "filename": "ke2_airflow_commons-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ee6f2a2dc0e759a4ef197496ff619f6e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9,<4.0",
            "size": 24564,
            "upload_time": "2023-05-18T20:31:52",
            "upload_time_iso_8601": "2023-05-18T20:31:52.418519Z",
            "url": "https://files.pythonhosted.org/packages/63/56/ac71de3755cc73efb7e1ad37215d5f26b25e30a9ae157579070470631516/ke2_airflow_commons-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-05-18 20:31:52",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ke2-airflow-commons"
}
        
Elapsed time: 0.17763s