> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Orquestre consultas e carregamentos de dados no ClickHouse a partir do Apache Airflow usando o provedor do ClickHouse

# Conecte o Apache Airflow ao ClickHouse

export const ClickHouseSupportedBadge = () => {
  return <div className="ClickHouseSupportedBadge">
            <div className="ClickHouseSupportedIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M1.30762 1.39073C1.30762 1.3103 1.37465 1.22986 1.46849 1.22986H2.64824C2.72868 1.22986 2.80912 1.29689 2.80912 1.39073V14.4886C2.80912 14.5691 2.74209 14.6495 2.64824 14.6495H1.46849C1.38805 14.6495 1.30762 14.5825 1.30762 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M4.2832 1.39073C4.2832 1.3103 4.35023 1.22986 4.44408 1.22986H5.62383C5.70427 1.22986 5.7847 1.29689 5.7847 1.39073V14.4886C5.7847 14.5691 5.71767 14.6495 5.62383 14.6495H4.44408C4.36364 14.6495 4.2832 14.5825 4.2832 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M7.25977 1.39073C7.25977 1.3103 7.3268 1.22986 7.42064 1.22986H8.60039C8.68083 1.22986 8.76127 1.29689 8.76127 1.39073V14.4886C8.76127 14.5691 8.69423 14.6495 8.60039 14.6495H7.42064C7.3402 14.6495 7.25977 14.5825 7.25977 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M10.2354 1.39073C10.2354 1.3103 10.3024 1.22986 10.3962 1.22986H11.576C11.6564 1.22986 11.7369 1.29689 11.7369 1.39073V14.4886C11.7369 14.5691 11.6698 14.6495 11.576 14.6495H10.3962C10.3158 14.6495 10.2354 14.5825 10.2354 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M13.2256 6.6057C13.2256 6.52526 13.2926 6.44482 13.3865 6.44482H14.5662C14.6466 6.44482 14.7271 6.51186 14.7271 6.6057V9.27354C14.7271 9.35398 14.6601 9.43442 14.5662 9.43442H13.3865C13.306 9.43442 13.2256 9.36739 13.2256 9.27354V6.6057Z" fill="currentColor" />
                </svg>
            </div>
            Suportado pelo ClickHouse
        </div>;
};

<ClickHouseSupportedBadge />

[Apache Airflow](https://airflow.apache.org/) é uma plataforma de código aberto para criar, agendar e monitorar fluxos de trabalho como código. Os fluxos de trabalho são definidos como grafos acíclicos direcionados (DAGs) de tarefas escritas em Python.

O provedor `apache-airflow-providers-clickhousedb` conecta o Airflow ao ClickHouse, permitindo executar consultas, criar tabelas e carregar dados como parte de um DAG. Ele se conecta pela [interface HTTP](/pt-BR/concepts/features/interfaces/http) usando o cliente [`clickhouse-connect`](/pt-BR/integrations/language-clients/python/index) e expõe o ClickHouse por meio do framework SQL padrão do Airflow, para que o `SQLExecuteQueryOperator` padrão lide com DDL, DML e consultas analíticas sem exigir um operador específico do ClickHouse.

<Note>
  Já usa o `airflow-clickhouse-plugin` da comunidade? Ele utiliza um driver, protocolo e porta diferentes. Siga o
  [guia de migração](/pt-BR/integrations/connectors/data-ingestion/etl-tools/airflow-migrating-from-airflow-clickhouse-plugin) para mover DAGs e conexões existentes para o provedor.
</Note>

<h2 id="install-the-provider">
  Instale o provedor
</h2>

Instale o provedor no ambiente onde o scheduler e os workers do Airflow são executados:

```bash theme={null}
pip install apache-airflow-providers-clickhousedb
```

O provedor depende de `apache-airflow-providers-common-sql` e `clickhouse-connect`, que são instalados junto com ele. Para passar os resultados da consulta para DataFrames do pandas ou do polars, instale os extras opcionais:

```bash theme={null}
pip install 'apache-airflow-providers-common-sql[pandas,polars]'
```

<h2 id="create-a-clickhouse-connection">
  Criar uma conexão com o ClickHouse
</h2>

O provedor registra um tipo de conexão `clickhouse`. Crie uma conexão pela UI do Airflow em **Admin > Connections** ou defina uma pela CLI ou por uma variável de ambiente.

Na UI, selecione **ClickHouse** como tipo de conexão e preencha os campos:

| Campo | Descrição | Padrão |
| - | - | - |
| **Host** | Hostname do servidor ClickHouse, por exemplo `abc123.clickhouse.cloud` | `localhost` |
| **Port** | Porta HTTP(S) | `8123` (sem TLS), `8443` (TLS) |
| **Login** | Nome de usuário do ClickHouse | `default` |
| **Password** | Senha do usuário do ClickHouse | (vazio) |
| **Database** | Banco de dados padrão da conexão. Na UI, esse campo aparece como **Database**; ao definir a conexão por URI ou JSON, ele corresponde ao campo `schema`. | `default` |

Para o [ClickHouse Cloud](/pt-BR/products/cloud/getting-started/intro) ou qualquer cluster self-hosted com TLS habilitado, defina `secure` como `true` no campo **Extra** e use a porta TLS (`8443`).

<h3 id="extra-connection-options">
  Opções extras de conexão
</h3>

O provedor disponibiliza opções adicionais como campos específicos no formulário de conexão. Se, em vez disso, você definir a conexão por URI, JSON ou variável de ambiente, informe essas opções como chaves no objeto JSON `extra`. Todas são opcionais:

| chave `extra` | campo da UI | padrão | descrição |
| - | - | - | - |
| `secure` | Usar TLS (HTTPS) | `false` | Habilita HTTPS/TLS. |
| `verify` | Verificar certificado SSL | `true` | Verifica o certificado TLS do servidor quando `secure` é `true`. Defina `false` para certificados autoassinados. |
| `connect_timeout` | Tempo limite de conexão (segundos) | `10` | Tempo limite da conexão HTTP, em segundos. |
| `send_receive_timeout` | Tempo limite da consulta (segundos) | `300` | Tempo limite de leitura/gravação da consulta, em segundos. Aumente esse valor para consultas analíticas de longa duração. |
| `compress` | Habilitar compactação LZ4 | `true` | Habilita a compactação LZ4 dos resultados. |
| `client_name` | Nome do cliente | (vazio) | Um rótulo acrescentado ao identificador da versão do Airflow no cabeçalho HTTP `User-Agent`, registrado na coluna `http_user_agent` de [`system.query_log`](/pt-BR/reference/system-tables/query_log). |
| `session_settings` | Configurações de sessão (JSON) | (vazio) | [Configurações de sessão do ClickHouse](/pt-BR/reference/settings/session-settings) aplicadas a cada consulta nessa conexão, por exemplo `{"max_execution_time": 300, "max_threads": 8}`. |
| `client_kwargs` | kwargs do cliente (JSON) | (vazio) | Argumentos de palavra-chave adicionais encaminhados para `clickhouse_connect.get_client()`, por exemplo um `http_proxy`. |

<h3 id="define-a-connection-without-the-ui">
  Defina uma conexão sem a UI
</h3>

Defina a conexão por meio de uma variável de ambiente. O formato de URI abrange host, credenciais e banco de dados:

```bash theme={null}
export AIRFLOW_CONN_CLICKHOUSE_DEFAULT='clickhouse://default:password@localhost:8123/my_database'
```

Todos os componentes do URI devem ser codificados para URL. Para TLS, timeouts ou configurações de sessão, use o formato JSON, que expõe os campos **Extra**:

```bash theme={null}
export AIRFLOW_CONN_CLICKHOUSE_DEFAULT='{
    "conn_type": "clickhouse",
    "host": "abc123.clickhouse.cloud",
    "port": 8443,
    "login": "default",
    "password": "secret",
    "schema": "my_database",
    "extra": {
        "secure": true,
        "session_settings": {
            "max_execution_time": 300,
            "max_memory_usage": 10000000000
        }
    }
}'
```

Todos os hooks e operadores usam o ID de conexão `clickhouse_default`, a menos que você especifique outro.

<h2 id="run-queries">
  Executar consultas com SQLExecuteQueryOperator
</h2>

Defina o `conn_id` do operador para a sua conexão do ClickHouse. O DAG a seguir cria uma tabela, insere linhas, lê essas linhas novamente e exclui a tabela:

```python theme={null}
from datetime import datetime

from airflow import DAG
from airflow.providers.common.sql.hooks.handlers import fetch_all_handler
from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator

CLICKHOUSE_CONN_ID = "clickhouse_default"
CLICKHOUSE_TABLE = "airflow_example"

with DAG(
    dag_id="example_clickhouse",
    start_date=datetime(2021, 1, 1),
    default_args={"conn_id": CLICKHOUSE_CONN_ID},
    schedule="@once",
    catchup=False,
) as dag:
    create_table = SQLExecuteQueryOperator(
        task_id="create_table",
        sql=f"""
            CREATE TABLE IF NOT EXISTS {CLICKHOUSE_TABLE} (
                id   UInt32,
                name String,
                ts   DateTime DEFAULT now()
            ) ENGINE = MergeTree()
            ORDER BY id
        """,
    )

    insert_rows = SQLExecuteQueryOperator(
        task_id="insert_rows",
        sql=f"""
            INSERT INTO {CLICKHOUSE_TABLE} (id, name) VALUES
                (1, 'Alice'),
                (2, 'Bob'),
                (3, 'Charlie')
        """,
    )

    read_rows = SQLExecuteQueryOperator(
        task_id="read_rows",
        sql=f"SELECT id, name FROM {CLICKHOUSE_TABLE} ORDER BY id",
        handler=fetch_all_handler,
    )

    drop_table = SQLExecuteQueryOperator(
        task_id="drop_table",
        sql=f"DROP TABLE IF EXISTS {CLICKHOUSE_TABLE}",
    )

    create_table >> insert_rows >> read_rows >> drop_table
```

Os resultados da consulta são recuperados com o `handler` padrão (`fetch_all_handler`). Para retornar algo diferente do conjunto completo de resultados, passe um `handler` diferente, como `fetch_one_handler`, para retornar apenas a primeira linha.

<h3 id="target-a-different-database">
  Use um banco de dados diferente por tarefa
</h3>

Quando uma conexão aponta para um cluster e tarefas individuais fazem consultas em bancos de dados diferentes, sobrescreva o banco de dados por meio de `hook_params` em vez de criar uma conexão separada:

```python theme={null}
read_rows = SQLExecuteQueryOperator(
    task_id="read_rows",
    conn_id=CLICKHOUSE_CONN_ID,
    sql="SELECT count() FROM events",
    hook_params={"database": "analytics"},
)
```

<h2 id="use-the-hook-directly">
  Use o hook diretamente
</h2>

Para casos que não se encaixam em um operador SQL — inserção em massa, streaming ou chamadas específicas do cliente ClickHouse — use `ClickHouseHook` dentro de uma tarefa em Python.

O método `bulk_insert_rows` do hook usa o caminho nativo de inserção colunar em `clickhouse-connect`, que é muito mais rápido do que inserções linha por linha para grandes volumes de dados. Defina `batch_size` para limitar o pico de memória em entradas muito grandes:

```python theme={null}
from airflow.providers.clickhousedb.hooks.clickhouse import ClickHouseHook

hook = ClickHouseHook(clickhouse_conn_id="clickhouse_default")

hook.bulk_insert_rows(
    table="events",
    rows=[("user1", "click"), ("user2", "view")],
    column_names=["user_id", "action"],
    batch_size=1000,
)
```

Chame `get_client()` para acessar o client subjacente do `clickhouse-connect` para tudo o que o hook não expõe diretamente:

```python theme={null}
client = hook.get_client()
total = client.query("SELECT count() FROM events").result_rows[0][0]
```

<h3 id="apply-session-settings">
  Aplicar configurações de sessão
</h3>

Passe [configurações de sessão](/pt-BR/reference/settings/session-settings) ao construir o hook, seja diretamente ou por meio do `hook_params` de um operador. As configurações passadas ao construtor são mescladas com quaisquer `session_settings` definidas no campo **Extra** da conexão, e os valores do construtor prevalecem em caso de conflito entre chaves:

```python theme={null}
hook = ClickHouseHook(
    clickhouse_conn_id="clickhouse_default",
    session_settings={"max_execution_time": 60, "max_threads": 4},
)
```

<h2 id="related-content">
  Conteúdo relacionado
</h2>

* [Migrar do airflow-clickhouse-plugin](/pt-BR/integrations/connectors/data-ingestion/etl-tools/airflow-migrating-from-airflow-clickhouse-plugin)
* [`clickhouse-connect` cliente Python](/pt-BR/integrations/language-clients/python/index)
* [interface HTTP do ClickHouse](/pt-BR/concepts/features/interfaces/http)
* [referência das configurações de sessão do ClickHouse](/pt-BR/reference/settings/session-settings)
* [documentação de referência do `apache-airflow-providers-clickhousedb`](https://airflow.apache.org/docs/apache-airflow-providers-clickhousedb/)
* [Pacote do provedor no PyPI](https://pypi.org/project/apache-airflow-providers-clickhousedb/)
