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 TABLEapenas 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 TABLEapenas para criar uma nova tabela transacional.
-
Tabelas externas: O comando
CLONE TABLEnão copia dados de tabelas externas.-
Controle de acesso em nível de linha ou mascaramento de dados:
Não use
CLONE TABLEem tabelas com Row Access Policy ou Data Masking Policy aplicada. Entre regiões: O comandoCLONE TABLEnã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 TABLEnã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 ASpara migrar os dados.Tabelas particionadas: Use
CREATE TABLE LIKEpara criar a tabela e, em seguida,INSERT OVERWRITEpara migrar os dados.
-
Evolução de Schema:
Não use
CLONE TABLEem 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 |
|
|
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. |
|
|
Sim |
Nome da tabela de origem. |
|
|
Não |
Partição a copiar. Formato: |
|
|
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. |
|
|
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 |
|
Tabela de destino existente + |
Sobrescreve os dados na tabela de destino ou na partição especificada. |
|
Tabela de destino existente + |
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
-
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); -
Consulte a tabela para verificar:
SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail;
Non-partitioned table: sale_detail_np
-
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); -
Consulte a tabela para verificar:
SELECT * FROM sale_detail_np;
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.