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

> Migração do Amazon Redshift para o ClickHouse

# Guia de migração do Amazon Redshift para o ClickHouse

<div id="introduction">
  ## Introdução
</div>

[Amazon Redshift](https://aws.amazon.com/redshift/) é uma solução popular de armazenamento de dados em nuvem da Amazon Web Services. Este guia apresenta diferentes abordagens para migrar dados de uma instância do Redshift para o ClickHouse. Abordaremos três opções:

<div className="ch-image-md">
  <Frame>
    <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/redshift-to-clickhouse.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=2d7b2552ffcb46e509cab717bb8581a1" alt="Opções de migração do Redshift para o ClickHouse" width="2048" height="1086" data-path="images/integrations/data-ingestion/redshift/redshift-to-clickhouse.webp" />
  </Frame>
</div>

Da perspectiva da instância do ClickHouse, você pode:

1. **[enviar](#push-data-from-redshift-to-clickhouse)** enviar dados para o ClickHouse usando uma ferramenta ou serviço de ETL/ELT de terceiros

2. **[extrair](#pull-data-from-redshift-to-clickhouse)** extrair dados do Redshift com a ajuda da ClickHouse bridge

3. **[pivotar](#pivot-data-from-redshift-to-clickhouse-using-s3)** usar armazenamento de objetos do S3 com uma lógica de "descarregar e depois carregar"

<Note>
  Usamos o Redshift como fonte de dados neste tutorial. No entanto, as abordagens de migração apresentadas aqui não se limitam ao Redshift, e etapas semelhantes podem ser adaptadas para qualquer fonte de dados compatível.
</Note>

<div id="push-data-from-redshift-to-clickhouse">
  ## Enviar dados do Redshift para o ClickHouse
</div>

No cenário de envio, a ideia é usar uma ferramenta ou serviço de terceiros (seja código personalizado ou um [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)) para enviar seus dados à sua instância do ClickHouse. Por exemplo, você pode usar um software como o [Airbyte](https://www.airbyte.com/) para transferir dados entre sua instância do Redshift (como origem) e o ClickHouse como destino ([veja nosso guia de integração do Airbyte](/docs/pt-BR/integrations/connectors/data-ingestion/etl-tools/airbyte-and-clickhouse))

<div className="ch-image-md">
  <Frame>
    <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/push.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=45370526d54708e640e8953db4b6a333" alt="enviar do Redshift para o ClickHouse" width="2048" height="398" data-path="images/integrations/data-ingestion/redshift/push.webp" />
  </Frame>
</div>

<div id="pros">
  ### Vantagens
</div>

* Pode aproveitar o catálogo existente de conectores do software de ETL/ELT.
* Recursos nativos para manter os dados em sincronia (lógica de append/overwrite/increment).
* Permite cenários de transformação de dados (por exemplo, consulte nosso [guia de integração para dbt](/docs/pt-BR/integrations/connectors/data-ingestion/etl-tools/dbt/index)).

<div id="cons">
  ### Desvantagens
</div>

* Você precisa configurar e manter uma infraestrutura de ETL/ELT.
* Introduz um componente de terceiros na arquitetura, que pode se tornar um gargalo de escalabilidade.

<div id="pull-data-from-redshift-to-clickhouse">
  ## Extrair dados do Redshift para o ClickHouse
</div>

No cenário de extração, a ideia é usar a ClickHouse JDBC Bridge para se conectar diretamente a um cluster do Redshift a partir de uma instância do ClickHouse e executar consultas `INSERT INTO ... SELECT`:

<div className="ch-image-md">
  <Frame>
    <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/pull.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=5acfc70a899be9888dda484c26414046" alt="extração do Redshift para o ClickHouse" width="2048" height="398" data-path="images/integrations/data-ingestion/redshift/pull.webp" />
  </Frame>
</div>

<div id="pros-1">
  ### Prós
</div>

* Genérico para todas as ferramentas compatíveis com JDBC
* Solução elegante para permitir consultas a várias fontes de dados externas a partir do ClickHouse

<div id="cons">
  ### Desvantagens
</div>

* Requer uma instância do ClickHouse JDBC Bridge, o que pode se tornar um gargalo de escalabilidade

<Note>
  Embora o Redshift seja baseado em PostgreSQL, não é possível usar a table function PostgreSQL do ClickHouse nem o table engine, pois o ClickHouse exige PostgreSQL versão 9 ou superior, e a API do Redshift é baseada em uma versão anterior (8.x).
</Note>

<div id="tutorial">
  ### Tutorial
</div>

Para usar esta opção, você precisa configurar uma ClickHouse JDBC Bridge. A ClickHouse JDBC Bridge é um aplicativo Java independente que gerencia a conectividade JDBC e atua como proxy entre a instância do ClickHouse e as fontes de dados. Para este tutorial, usamos uma instância do Redshift pré-carregada com um [banco de dados de exemplo](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

<Steps>
  <Step title="Implante a ClickHouse JDBC Bridge" id="deploy-clickhouse-jdbc-bridge">
    Implante a ClickHouse JDBC Bridge. Para mais detalhes, consulte nosso guia do usuário sobre [JDBC para fontes de dados externas](/docs/pt-BR/integrations/connectors/data-ingestion/jdbc-with-clickhouse)

    <Note>
      Se você estiver usando o ClickHouse Cloud, precisará executar sua ClickHouse JDBC Bridge em um ambiente separado e se conectar ao ClickHouse Cloud usando a função [remoteSecure](/docs/pt-BR/reference/functions/table-functions/remote)
    </Note>
  </Step>

  <Step title="Configure sua fonte de dados do Redshift" id="configure-your-redshift-datasource">
    Configure sua fonte de dados do Redshift para a ClickHouse JDBC Bridge. Por exemplo, `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json `

    ```json theme={null}
    {
     "redshift-server": {
       "aliases": [
         "redshift"
       ],
       "driverUrls": [
       "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar"
       ],
       "driverClassName": "com.amazon.redshift.jdbc.Driver",
       "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev",
       "username": "awsuser",
       "password": "<password>",
       "maximumPoolSize": 5
     }
    }
    ```
  </Step>

  <Step title="Consulte sua instância do Redshift no ClickHouse" id="query-your-redshift-instance-from-clickhouse">
    Depois que a ClickHouse JDBC Bridge estiver implantada e em execução, você poderá começar a consultar sua instância do Redshift no ClickHouse

    ```sql theme={null}
    SELECT *
    FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
    ```

    ```response theme={null}
    Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0

    ┌─username─┬─firstname─┬─lastname─┐
    │ PGL08LJI │ Vladimir  │ Humphrey │
    │ XDZ38RDD │ Barry     │ Roy      │
    │ AEB55QTM │ Reagan    │ Hodge    │
    │ OWY35QYB │ Tamekah   │ Juarez   │
    │ MSD36KVR │ Mufutau   │ Watkins  │
    └──────────┴───────────┴──────────┘

    5 rows in set. Elapsed: 0.438 sec.
    ```

    ```sql theme={null}
    SELECT *
    FROM jdbc('redshift', 'select count(*) from sales')
    ```

    ```response theme={null}
    Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b

    ┌──count─┐
    │ 172456 │
    └────────┘

    1 rows in set. Elapsed: 0.304 sec.
    ```
  </Step>

  <Step title="Importe dados do Redshift para o ClickHouse" id="import-data-from-redshift-to-clickhouse">
    A seguir, mostramos como importar dados usando uma instrução `INSERT INTO ... SELECT`

    ```sql theme={null}
    # CRIAÇÃO DA TABELA com 3 colunas
    CREATE TABLE users_imported
    (
       `username` String,
       `firstname` String,
       `lastname` String
    )
    ENGINE = MergeTree
    ORDER BY firstname
    ```

    ```response theme={null}
    Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05

    Ok.

    0 rows in set. Elapsed: 0.233 sec.
    ```

    ```sql theme={null}
    INSERT INTO users_imported (*) SELECT *
    FROM jdbc('redshift', 'select username, firstname, lastname from users')
    ```

    ```response theme={null}
    Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1

    Ok.

    0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.)
    ```
  </Step>
</Steps>

<div id="pivot-data-from-redshift-to-clickhouse-using-s3">
  ## Pivotar dados do Redshift para o ClickHouse usando S3
</div>

Neste cenário, exportamos os dados para o S3 em um formato intermediário e, em uma segunda etapa, carregamos os dados do S3 no ClickHouse.

<div className="ch-image-md">
  <Frame>
    <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/pivot.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=43b2a1a0f4d74e311f5a96a93514cc4f" alt="pivotar do Redshift usando S3" width="2048" height="730" data-path="images/integrations/data-ingestion/redshift/pivot.webp" />
  </Frame>
</div>

<div id="pros-1">
  ### Prós
</div>

* Tanto o Redshift quanto o ClickHouse têm recursos poderosos de integração com S3.
* Aproveita recursos já existentes, como o comando `UNLOAD` do Redshift e a função de tabela S3 / table engine do ClickHouse.
* Escala com facilidade graças às leituras paralelas e ao alto throughput de/para o S3 no ClickHouse.
* Pode aproveitar formatos avançados e compactados, como o Apache Parquet.

<div id="cons">
  ### Desvantagens
</div>

* Duas etapas no processo (exportar do Redshift e depois carregar no ClickHouse).

<div id="tutorial">
  ### Tutorial
</div>

<Steps>
  <Step title="Exporte os dados para um bucket do S3 usando UNLOAD" id="export-data-into-an-s3-bucket-using-unload">
    Usando o recurso [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) do Redshift, exporte os dados para um bucket privado existente do S3:

    <div className="ch-image-md">
      <Frame>
        <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/s3-1.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=941ef4006e7eea52ec7bf29d263f7bda" alt="UNLOAD do Redshift para o S3" style={{ backgroundColor: "white" }} width="707" height="269" data-path="images/integrations/data-ingestion/redshift/s3-1.webp" />
      </Frame>
    </div>

    Isso gerará arquivos de partes contendo os dados brutos no S3.

    <div className="ch-image-md">
      <Frame>
        <img src="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/redshift/s3-2.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=dc523f398dce2165fc369aa5cdd5fea1" alt="Dados no S3" style={{ backgroundColor: "white" }} width="1102" height="169" data-path="images/integrations/data-ingestion/redshift/s3-2.webp" />
      </Frame>
    </div>
  </Step>

  <Step title="Crie a tabela no ClickHouse" id="create-the-table-in-clickhouse">
    Crie a tabela no ClickHouse:

    ```sql theme={null}
    CREATE TABLE users
    (
      username String,
      firstname String,
      lastname String
    )
    ENGINE = MergeTree
    ORDER BY username
    ```

    Como alternativa, o ClickHouse pode tentar inferir a estrutura da tabela usando `CREATE TABLE ... EMPTY AS SELECT`:

    ```sql theme={null}
    CREATE TABLE users
    ENGINE = MergeTree ORDER BY username
    EMPTY AS
    SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
    ```

    Isso funciona especialmente bem quando os dados estão em um formato que contém informações sobre tipos de dados, como Parquet.
  </Step>

  <Step title="Carregue os arquivos do S3 no ClickHouse" id="load-s3-files-into-clickhouse">
    Carregue os arquivos do S3 no ClickHouse usando uma instrução `INSERT INTO ... SELECT`:

    ```sql theme={null}
    INSERT INTO users SELECT *
    FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
    ```

    ```response theme={null}
    Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557

    Ok.

    0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.)
    ```

    <Note>
      Este exemplo usou CSV como formato para pivotar. No entanto, para cargas de trabalho de produção, recomendamos Apache Parquet como a melhor opção para grandes migrações, já que ele oferece compressão e pode reduzir custos de armazenamento, além de diminuir os tempos de transferência. (Por padrão, cada row group é comprimido com SNAPPY.) O ClickHouse também aproveita a organização colunar do Parquet para acelerar a ingestão de dados.
    </Note>
  </Step>
</Steps>
