Todos os produtos
Search
Central de documentação

MaxCompute:CLONE TABLE

Última atualização: Jun 26, 2026

O comando CLONE TABLE copia dados de uma tabela de origem para uma tabela de destino. Use esse recurso para migrar dados entre tabelas no mesmo projeto MaxCompute ou em projetos diferentes, desde que estejam na mesma região e classe de armazenamento.

Limitações

  • Compatibilidade de schema: O schema da tabela de destino deve ser compatível com o da tabela de origem.

  • Limite de cópia de partições:

    • Na cópia para uma tabela de destino existente, o limite é de 10.000 partições por vez.

    • Se a tabela de destino não existir, não há limite de partições e a operação é atômica.

  • Tipos de tabela suportados:

    • PK/Append Delta Table:

      Não é possível sobrescrever Delta Tables existentes. Use CLONE TABLE apenas para criar uma nova Delta Table.

    • Tabelas regulares (particionadas, não particionadas e clusterizadas).

    • Tabelas transacionais:

      Não é possível sobrescrever tabelas transacionais existentes. Use CLONE TABLE apenas para criar uma nova tabela transacional.

  • Tabelas externas: O comando CLONE TABLE não copia dados de tabelas externas.

  • Controle de acesso em nível de linha ou mascaramento de dados:

    Não use CLONE TABLE em tabelas com Row Access Policy ou Data Masking Policy aplicada. Entre regiões: O comando CLONE TABLE não copia dados entre projetos MaxCompute em regiões ou clusters diferentes (inclusive durante migrações de O&M de projetos).

  • Entre classes de armazenamento:

    O comando CLONE TABLE não copia dados entre projetos com classes de armazenamento diferentes (por exemplo, de um projeto com armazenamento multi-AZ para um com armazenamento single-AZ, ou vice-versa).

    Para migrar dados entre projetos com classes de armazenamento distintas, use as seguintes alternativas:

    • Tabelas não particionadas: Use CREATE TABLE AS para migrar os dados.

    • Tabelas particionadas: Use CREATE TABLE LIKE para criar a tabela e, em seguida, INSERT OVERWRITE para migrar os dados.

  • Evolução de Schema:

    Não use CLONE TABLE em tabelas que passaram por Evolução de Schema (como adição ou remoção de colunas).

Faturamento

O comando CLONE TABLE é uma operação baseada em metadados e não gera custos de computação. A tabela de destino clonada é faturada conforme o uso real de armazenamento.

Sintaxe

CLONE TABLE [<src_project_name>.]<src_table_name> [PARTITION (<pt_spec>), ...]
TO [<dest_project_name>.]<dest_table_name> [IF EXISTS [OVERWRITE | IGNORE]];

Parâmetros:

Parâmetro

Obrigatório

Descrição

src_project_name

Não

Projeto MaxCompute que contém a tabela de origem. O padrão é o projeto atual. Obrigatório quando as tabelas de origem e destino estão em projetos diferentes.

src_table_name

Sim

Nome da tabela de origem.

pt_spec

Não

Partição a copiar. Formato: partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...

dest_project_name

Não

Projeto MaxCompute que contém a tabela de destino. O padrão é o projeto atual. Obrigatório quando as tabelas de origem e destino estão em projetos diferentes.

dest_table_name

Sim

Nome da tabela de destino. Consulte a tabela de comportamento abaixo.

Comportamento da tabela de destino:

Condição

Comportamento

Tabela de destino inexistente

Cria a tabela com a semântica de CREATE TABLE LIKE e copia os dados. Para mais detalhes, consulte Criar uma tabela.

Tabela de destino existente + IF EXISTS OVERWRITE

Sobrescreve os dados na tabela de destino ou na partição especificada.

Tabela de destino existente + IF EXISTS IGNORE

Ignora as partições existentes sem sobrescrever seus dados.

Dados de exemplo

Os exemplos a seguir usam duas tabelas de amostra. Execute os comandos abaixo para criá-las e preenchê-las.

Partitioned table: sale_detail

  1. Crie uma tabela particionada.

    -- Create a partitioned table
    CREATE TABLE IF NOT EXISTS sale_detail
    (
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE
    )
    PARTITIONED BY (sale_date STRING, region STRING);
    
    -- Add partitions
    ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china') PARTITION (sale_date='2014', region='shanghai');
    
    -- Insert data
    INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
    INSERT INTO sale_detail PARTITION (sale_date='2014', region='shanghai') VALUES ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);
  2. Consulte a tabela para verificar:

    SET odps.sql.allow.fullscan=true;
    SELECT * FROM sale_detail;

    Visualize results

    Saída esperada:

    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | 2013       | china      |
    | s2         | c2          | 100.2       | 2013       | china      |
    | s3         | c3          | 100.3       | 2013       | china      |
    | null       | c5          | NULL        | 2014       | shanghai   |
    | s6         | c6          | 100.4       | 2014       | shanghai   |
    | s7         | c7          | 100.5       | 2014       | shanghai   |
    +------------+-------------+-------------+------------+------------+

Non-partitioned table: sale_detail_np

  1. Crie uma tabela não particionada.

    -- Create a non-partitioned table
    CREATE TABLE IF NOT EXISTS sale_detail_np
    (
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE
    );
    
    -- Insert data
    INSERT INTO sale_detail_np VALUES ('s4','c4',100.4);
  2. Consulte a tabela para verificar:

    SELECT * FROM sale_detail_np;

    Visualize results

    Saída esperada:

    +------------+-------------+-------------+
    | shop_name  | customer_id | total_price |
    +------------+-------------+-------------+
    | s4         | c4          | 100.4       |
    +------------+-------------+-------------+

Exemplos

Exemplo 1: Copiar uma tabela não particionada para uma nova tabela

CLONE TABLE sale_detail_np TO sale_detail_np_clone; -- Creates sale_detail_np_clone and copies all data

SELECT * FROM sale_detail_np_clone;

Saída esperada:

+------------+-------------+-------------+
| shop_name  | customer_id | total_price |
+------------+-------------+-------------+
| s4         | c4          | 100.4       |
+------------+-------------+-------------+

Exemplo 2: Copiar uma partição específica para uma tabela existente

CLONE TABLE sale_detail PARTITION (sale_date='2013', region='china')
TO sale_detail_clone IF EXISTS OVERWRITE; -- Copies only the 2013/china partition; overwrites if the partition exists

SELECT * FROM sale_detail_clone;

Saída esperada:

+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
+------------+-------------+-------------+------------+------------+

Exemplo 3: Copiar todas as partições ignorando as existentes

Este exemplo dá continuidade ao anterior. A tabela sale_detail_clone já contém a partição 2013/china. A opção IF EXISTS IGNORE copia as partições restantes sem alterar a existente.

CLONE TABLE sale_detail TO sale_detail_clone IF EXISTS IGNORE; -- Adds new partitions; skips partitions that already exist

SELECT * FROM sale_detail_clone;

Saída esperada:

+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
| null       | c5          | NULL        | 2014       | shanghai   |
| s6         | c6          | 100.4       | 2014       | shanghai   |
| s7         | c7          | 100.5       | 2014       | shanghai   |
+------------+-------------+-------------+------------+------------+

Exemplo 4: Copiar todas as partições para uma nova tabela

CLONE TABLE sale_detail TO sale_detail_clone1; -- Creates sale_detail_clone1 and copies all partitions atomically

SELECT * FROM sale_detail_clone1;

Saída esperada:

+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
| null       | c5          | NULL        | 2014       | shanghai   |
| s6         | c6          | 100.4       | 2014       | shanghai   |
| s7         | c7          | 100.5       | 2014       | shanghai   |
+------------+-------------+-------------+------------+------------+

Exemplo 5: Clonar uma Delta Table

  • Clonar uma Delta Table não particionada

    -- Create a non-partitioned Delta Table
    CREATE TABLE IF NOT EXISTS sale_detail_delta
    (
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE
    )
    TBLPROPERTIES ("table.format.version"="2");
    
    INSERT INTO sale_detail_delta VALUES ('s1','c1',100.1),('s2','c2',100.2);
    
    -- Clone example
    CLONE TABLE sale_detail_delta TO sale_detail_delta_clone;
  • Clonar uma Delta Table particionada

    -- Create a partitioned Delta Table
    CREATE TABLE IF NOT EXISTS sale_detail_delta_pt
    (
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE
    )
    PARTITIONED BY (dd STRING, hh STRING)
    TBLPROPERTIES ("table.format.version"="2");
    
    INSERT INTO sale_detail_delta_pt PARTITION (dd='01', hh='01') VALUES ('s3','c3',100.3);
    
    -- Clone example
    CLONE TABLE sale_detail_delta_pt PARTITION (dd='01', hh='01') TO sale_detail_delta_pt_clone;

Melhores práticas

Para obter informações sobre como migrar dados entre projetos MaxCompute na mesma região, consulte Migrar dados entre projetos MaxCompute na mesma região usando CLONE TABLE.