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

> O ClickPipes permite conectar o ClickHouse ao DynamoDB.

# CDC do DynamoDB para o ClickHouse

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Sem suporte no ClickHouse Cloud
        </div>;
};

Esta página explica como configurar CDC do DynamoDB para o ClickHouse usando ClickPipes. Há 2 componentes nesta integração:

1. O snapshot inicial via S3 ClickPipes
2. Atualizações em tempo real via Kinesis ClickPipes

Os dados serão inseridos em uma `ReplacingMergeTree`. Esse mecanismo de tabela é comumente usado em cenários de CDC para permitir a aplicação de operações de atualização. Saiba mais sobre esse padrão nos seguintes artigos do blog:

* [Captura de Dados de Alteração (CDC) com PostgreSQL e ClickHouse - Parte 1](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-1?loc=docs-rockest-migrations)
* [Captura de Dados de Alteração (CDC) com PostgreSQL e ClickHouse - Parte 2](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-2?loc=docs-rockest-migrations)

<div id="1-set-up-kinesis-stream">
  ## 1. Configure o stream do Kinesis
</div>

Primeiro, habilite um stream do Kinesis na sua tabela do DynamoDB para capturar alterações em tempo real. É importante fazer isso antes de criar o snapshot para evitar a perda de dados.
Consulte o guia da AWS [aqui](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html).

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/kkh98eOd_iRyUp1R/images/integrations/data-ingestion/dbms/dynamodb/dynamodb-kinesis-stream.png?fit=max&auto=format&n=kkh98eOd_iRyUp1R&q=85&s=64a66c75d48c11dd898f3d25d532aa52" size="lg" alt="DynamoDB Kinesis Stream" border width="1238" height="215" data-path="images/integrations/data-ingestion/dbms/dynamodb/dynamodb-kinesis-stream.png" />

<div id="2-create-the-snapshot">
  ## 2. Crie o snapshot
</div>

Em seguida, vamos criar um snapshot da tabela do DynamoDB. Isso pode ser feito com uma exportação da AWS para o S3. Consulte o guia da AWS [aqui](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/S3DataExport.HowItWorks.html).
**Faça uma "Exportação completa" no formato DynamoDB JSON.**

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/kkh98eOd_iRyUp1R/images/integrations/data-ingestion/dbms/dynamodb/dynamodb-s3-export.png?fit=max&auto=format&n=kkh98eOd_iRyUp1R&q=85&s=8a0c1d01d2c12b65e99566ab60c66ab9" size="md" alt="Exportação do DynamoDB para S3" border width="686" height="929" data-path="images/integrations/data-ingestion/dbms/dynamodb/dynamodb-s3-export.png" />

<div id="3-load-the-snapshot-into-clickhouse">
  ## 3. Carregue o snapshot para o ClickHouse
</div>

<div id="create-necessary-tables">
  ### Crie as tabelas necessárias
</div>

Os dados do snapshot do DynamoDB terão esta aparência:

```json theme={null}
{
  "age": {
    "N": "26"
  },
  "first_name": {
    "S": "sally"
  },
  "id": {
    "S": "0A556908-F72B-4BE6-9048-9E60715358D4"
  }
}
```

Observe que os dados estão em um formato aninhado. Precisaremos desaninhar esses dados antes de carregá-los no ClickHouse. Isso pode ser feito usando a função `JSONExtract` no ClickHouse em uma visão materializada.

Vamos criar três tabelas:

1. Uma tabela para armazenar os dados brutos do DynamoDB
2. Uma tabela para armazenar os dados finais desaninhados (tabela de destino)
3. Uma visão materializada para desaninhar os dados

Para os dados de exemplo do DynamoDB acima, as tabelas do ClickHouse ficariam assim:

```sql theme={null}
/* Tabela de snapshot */
CREATE TABLE IF NOT EXISTS "default"."snapshot"
(
    `item` String
)
ORDER BY tuple();

/* Tabela para dados finais desaninhados */
CREATE MATERIALIZED VIEW IF NOT EXISTS "default"."snapshot_mv" TO "default"."destination" AS
SELECT
    JSONExtractString(item, 'id', 'S') AS id,
    JSONExtractInt(item, 'age', 'N') AS age,
    JSONExtractString(item, 'first_name', 'S') AS first_name
FROM "default"."snapshot";

/* Tabela para dados finais desaninhados */
CREATE TABLE IF NOT EXISTS "default"."destination" (
    "id" String,
    "first_name" String,
    "age" Int8,
    "version" Int64
)
ENGINE ReplacingMergeTree("version")
ORDER BY id;
```

Há alguns requisitos para a tabela de destino:

* Essa tabela deve ser uma tabela `ReplacingMergeTree`
* A tabela deve ter uma coluna `version`
  * Nas etapas seguintes, faremos o mapeamento do campo `ApproximateCreationDateTime` do Kinesis stream para a coluna `version`.
* A tabela deve usar a chave de partição como chave de ordenação (especificada por `ORDER BY`)
  * Linhas com a mesma chave de ordenação serão deduplicadas com base na coluna `version`.

<div id="create-the-snapshot-clickpipe">
  ### Crie o ClickPipe de snapshot
</div>

Agora você pode criar um ClickPipe para carregar os dados do snapshot do S3 para o ClickHouse. Siga o guia do S3 ClickPipe [aqui](/pt-BR/integrations/clickpipes/object-storage/amazon-s3/overview), mas use as seguintes configurações:

* **Caminho de ingestão**: Você precisará localizar o caminho dos arquivos JSON exportados no S3. O caminho será mais ou menos assim:

```text theme={null}
https://{bucket}.s3.amazonaws.com/{prefix}/AWSDynamoDB/{export-id}/data/*
```

* **Formato**: JSONEachRow
* **Tabela**: Sua tabela de snapshot (por exemplo, `default.snapshot` no exemplo acima)

Depois de criada, os dados começarão a ser preenchidos nas tabelas de snapshot e de destino. Você não precisa esperar o carregamento do snapshot terminar antes de passar para a próxima etapa.

<div id="4-create-the-kinesis-clickpipe">
  ## 4. Criar o ClickPipe do Kinesis
</div>

Agora podemos configurar o ClickPipe do Kinesis para capturar alterações em tempo real no stream do Kinesis. Siga o guia do ClickPipe do Kinesis [aqui](/pt-BR/integrations/clickpipes/kinesis/overview), mas use as seguintes configurações:

* **Stream**: o stream do Kinesis usado na etapa 1
* **Table**: sua tabela de destino (por exemplo, `default.destination` no exemplo acima)
* **Flatten object**: true
* **Column mappings**:
  * `ApproximateCreationDateTime`: `version`
  * Mapeie os outros campos para as colunas de destino apropriadas, como mostrado abaixo

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/kkh98eOd_iRyUp1R/images/integrations/data-ingestion/dbms/dynamodb/dynamodb-map-columns.png?fit=max&auto=format&n=kkh98eOd_iRyUp1R&q=85&s=1ef1b4e2c4bfaf1520346e6a3faf7baa" size="md" alt="Mapeamento de colunas do DynamoDB" border width="1784" height="1630" data-path="images/integrations/data-ingestion/dbms/dynamodb/dynamodb-map-columns.png" />

<div id="5-cleanup-optional">
  ## 5. Limpeza (opcional)
</div>

Quando o ClickPipe de snapshot for concluído, você poderá excluir a tabela de snapshot e a visão materializada.

```sql theme={null}
DROP TABLE IF EXISTS "default"."snapshot";
DROP TABLE IF EXISTS "default"."snapshot_clickpipes_error";
DROP VIEW IF EXISTS "default"."snapshot_mv";
```
