> ## 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.

> É 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](/pt-BR/concepts/features/operations/insert/deduplication) e [Configuração de desduplicação na inserção](/pt-BR/reference/settings/session-settings/insert#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).
