> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> É possível fazer a ingestão de dados no ClickHouse usando o Apache Beam

# Integração do Apache Beam com o 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 Beam**  é um modelo de programação unificado e de código aberto que permite aos desenvolvedores definir e executar pipelines de processamento de dados, tanto em lote quanto em fluxo (contínuo). A flexibilidade do Apache Beam está na sua capacidade de oferecer suporte a uma ampla variedade de cenários de processamento de dados, desde operações de ETL (Extract, Transform, Load) até o processamento complexo de eventos e analytics em tempo real.
Esta integração utiliza o [conector JDBC](https://github.com/ClickHouse/clickhouse-java) oficial do ClickHouse como camada subjacente de inserção.

<div id="integration-package">
  ## Pacote de integração
</div>

O pacote de integração necessário para integrar o Apache Beam ao ClickHouse é mantido e desenvolvido em [Apache Beam I/O Connectors](https://beam.apache.org/documentation/io/connectors/) — um pacote de integrations de vários sistemas populares de armazenamento de dados e bancos de dados.
A implementação de `org.apache.beam.sdk.io.clickhouse.ClickHouseIO` está localizada no [repositório do Apache Beam](https://github.com/apache/beam/tree/0bf43078130d7a258a0f1638a921d6d5287ca01e/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse).

<div id="setup-of-the-apache-beam-clickhouse-package">
  ## Configuração do pacote ClickHouse do Apache Beam
</div>

<div id="package-installation">
  ### Instalação do pacote
</div>

Adicione a seguinte dependência ao seu gerenciador de pacotes:

```xml theme={null}
<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-io-clickhouse</artifactId>
    <version>${beam.version}</version>
</dependency>
```

<Warning>
  **Versão recomendada do Beam**

  O conector `ClickHouseIO` é recomendado a partir da versão `2.59.0` do Apache Beam.
  As versões anteriores podem não oferecer suporte completo a todos os recursos do conector.
</Warning>

Os artefatos podem ser encontrados no [repositório oficial do Maven](https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-clickhouse).

<div id="code-example">
  ### Exemplo de código
</div>

O exemplo a seguir lê um arquivo CSV chamado `input.csv` como uma `PCollection`, converte-o em um objeto `Row` (usando o schema definido) e o insere em uma instância local do ClickHouse com `ClickHouseIO`:

```java theme={null}

package org.example;

import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.io.clickhouse.ClickHouseIO;
import org.apache.beam.sdk.schemas.Schema;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.Row;
import org.joda.time.DateTime;

public class Main {

    public static void main(String[] args) {
        // Cria um objeto Pipeline.
        Pipeline p = Pipeline.create();

        Schema SCHEMA =
                Schema.builder()
                        .addField(Schema.Field.of("name", Schema.FieldType.STRING).withNullable(true))
                        .addField(Schema.Field.of("age", Schema.FieldType.INT16).withNullable(true))
                        .addField(Schema.Field.of("insertion_time", Schema.FieldType.DATETIME).withNullable(false))
                        .build();

        // Aplica transformações ao pipeline.
        PCollection<String> lines = p.apply("ReadLines", TextIO.read().from("src/main/resources/input.csv"));

        PCollection<Row> rows = lines.apply("ConvertToRow", ParDo.of(new DoFn<String, Row>() {
            @ProcessElement
            public void processElement(@Element String line, OutputReceiver<Row> out) {

                String[] values = line.split(",");
                Row row = Row.withSchema(SCHEMA)
                        .addValues(values[0], Short.parseShort(values[1]), DateTime.now())
                        .build();
                out.output(row);
            }
        })).setRowSchema(SCHEMA);

        rows.apply("Write to ClickHouse",
                        ClickHouseIO.write("jdbc:clickhouse://localhost:8123/default?user=default&password=******", "test_table"));

        // Executa o pipeline.
        p.run().waitUntilFinish();
    }
}

```

<div id="supported-data-types">
  ## Tipos de dados suportados
</div>

| ClickHouse                         | Apache Beam                | Compatível | Observações                                                                                                                                                  |
| ---------------------------------- | -------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `TableSchema.TypeName.FLOAT32`     | `Schema.TypeName#FLOAT`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.FLOAT64`     | `Schema.TypeName#DOUBLE`   | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.INT8`        | `Schema.TypeName#BYTE`     | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.INT16`       | `Schema.TypeName#INT16`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.INT32`       | `Schema.TypeName#INT32`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.INT64`       | `Schema.TypeName#INT64`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.STRING`      | `Schema.TypeName#STRING`   | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.UINT8`       | `Schema.TypeName#INT16`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.UINT16`      | `Schema.TypeName#INT32`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.UINT32`      | `Schema.TypeName#INT64`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.UINT64`      | `Schema.TypeName#INT64`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.DATE`        | `Schema.TypeName#DATETIME` | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.DATETIME`    | `Schema.TypeName#DATETIME` | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.ARRAY`       | `Schema.TypeName#ARRAY`    | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.ENUM8`       | `Schema.TypeName#STRING`   | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.ENUM16`      | `Schema.TypeName#STRING`   | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.BOOL`        | `Schema.TypeName#BOOLEAN`  | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.TUPLE`       | `Schema.TypeName#ROW`      | ✅          |                                                                                                                                                              |
| `TableSchema.TypeName.FIXEDSTRING` | `FixedBytes`               | ✅          | `FixedBytes` é um `LogicalType` que representa um array de bytes <br /> de comprimento fixo, localizado em <br /> `org.apache.beam.sdk.schemas.logicaltypes` |
|                                    | `Schema.TypeName#DECIMAL`  | ❌          |                                                                                                                                                              |
|                                    | `Schema.TypeName#MAP`      | ❌          |                                                                                                                                                              |

<div id="clickhouseiowrite-parameters">
  ## Parâmetros de ClickHouseIO.Write
</div>

Você pode ajustar a configuração de `ClickHouseIO.Write` com as seguintes funções setter:

| Função setter de parâmetro  | Tipo de argumento           | Valor padrão                  | Descrição                                                               |
| --------------------------- | --------------------------- | ----------------------------- | ----------------------------------------------------------------------- |
| `withMaxInsertBlockSize`    | `(long maxInsertBlockSize)` | `1000000`                     | Tamanho máximo de um bloco de linhas a serem inseridas.                 |
| `withMaxRetries`            | `(int maxRetries)`          | `5`                           | Número máximo de tentativas para inserções com falha.                   |
| `withMaxCumulativeBackoff`  | `(Duration maxBackoff)`     | `Duration.standardDays(1000)` | Duração máxima acumulada de backoff para tentativas.                    |
| `withInitialBackoff`        | `(Duration initialBackoff)` | `Duration.standardSeconds(5)` | Duração do backoff inicial antes da primeira tentativa.                 |
| `withInsertDistributedSync` | `(Boolean sync)`            | `true`                        | Se `true`, sincroniza as operações de inserção em tabelas distribuídas. |
| `withInsertQuorum`          | `(Long quorum)`             | `null`                        | Número de réplicas necessário para confirmar uma operação de inserção.  |
| `withInsertDeduplicate`     | `(Boolean deduplicate)`     | `true`                        | Se `true`, a desduplicação é ativada para operações de inserção.        |
| `withTableSchema`           | `(TableSchema schema)`      | `null`                        | Schema da tabela ClickHouse de destino.                                 |

<div id="limitations">
  ## Limitações
</div>

Considere as seguintes limitações ao usar o conector:

* Até o momento, apenas a operação Sink é compatível. O conector não oferece suporte à operação Source.
* O ClickHouse realiza desduplicação ao inserir em uma tabela `ReplicatedMergeTree` ou em uma tabela `Distributed` construída sobre uma `ReplicatedMergeTree`. Sem replicação, inserir em uma tabela MergeTree comum pode resultar em duplicatas se uma inserção falhar e depois for repetida com sucesso. No entanto, cada bloco é inserido atomicamente, e o tamanho do bloco pode ser configurado usando `ClickHouseIO.Write.withMaxInsertBlockSize(long)`. A desduplicação é feita usando checksums dos blocos inseridos. Para mais informações sobre desduplicação, consulte [Desduplicação](/docs/pt-BR/concepts/features/operations/insert/deduplication) e [Configuração de desduplicação na inserção](/docs/pt-BR/reference/settings/session-settings#insert_deduplicate).
* O conector não executa nenhuma instrução DDL; portanto, a tabela de destino deve existir antes da inserção.

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

* documentação da classe `ClickHouseIO` [documentation](https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/clickhouse/ClickHouseIO.html).
* repositório do GitHub com exemplos [clickhouse-beam-connector](https://github.com/ClickHouse/clickhouse-beam-connector).
