CLONE TABLE copia los datos de una tabla de origen a una tabla de destino. Úselo para migrar datos entre tablas del mismo proyecto de MaxCompute o de proyectos distintos, siempre que se encuentren en la misma región y clase de almacenamiento.
Limitaciones
Compatibilidad de esquema: el esquema de la tabla de destino debe ser compatible con el de la tabla de origen.
-
Límite de particiones copiadas:
Si la tabla de destino ya existe, se pueden copiar hasta 10,000 particiones por operación.
Si la tabla de destino no existe, no hay límite de particiones y la operación es atómica.
-
Tipos de tabla compatibles:
-
PK/Append Delta Table:
No es posible sobrescribir las Delta Tables existentes. Solo puede usar
CLONE TABLEpara crear una nueva Delta Table. Tablas regulares (tablas particionadas, tablas no particionadas y tablas agrupadas).
-
Tablas transaccionales:
No es posible sobrescribir las tablas transaccionales existentes. Solo puede usar
CLONE TABLEpara crear una nueva tabla transaccional.
-
Tablas externas:
CLONE TABLEno permite copiar datos desde tablas externas.-
Control de acceso a nivel de fila o enmascaramiento de datos:
No se puede usar
CLONE TABLEen tablas que tengan aplicada una Row Access Policy o una Data Masking Policy. -
Operaciones entre regiones:
CLONE TABLEno permite copiar datos entre proyectos de MaxCompute ubicados en distintas regiones o clústeres, incluso durante las migraciones de operación y mantenimiento de proyectos. -
Operaciones entre clases de almacenamiento:
CLONE TABLEno permite copiar datos entre proyectos que usen clases de almacenamiento distintas. Por ejemplo, no funciona de un proyecto con almacenamiento multi-AZ a uno con almacenamiento single-AZ, ni viceversa.Para migrar datos entre proyectos con clases de almacenamiento diferentes, utilice las siguientes alternativas:
Tablas no particionadas: use
CREATE TABLE ASpara migrar los datos.Tablas particionadas: cree la tabla con
CREATE TABLE LIKEy luego migre los datos conINSERT OVERWRITE.
-
Schema Evolution:
No se puede usar
CLONE TABLEen tablas que hayan pasado por Schema Evolution, como agregar o eliminar columnas.
Facturación
CLONE TABLE es una operación basada en metadatos y no genera costos de cómputo. La tabla de destino clonada se factura según su uso real de almacenamiento.
Sintaxis
CLONE TABLE [<src_project_name>.]<src_table_name> [PARTITION (<pt_spec>), ...]
TO [<dest_project_name>.]<dest_table_name> [IF EXISTS [OVERWRITE | IGNORE]];
Parámetros:
|
Parameter |
Required |
Description |
|
|
No |
Proyecto de MaxCompute que contiene la tabla de origen. De forma predeterminada, corresponde al proyecto actual. Es obligatorio cuando las tablas de origen y destino están en proyectos distintos. |
|
|
Sí |
Nombre de la tabla de origen. |
|
|
No |
Partición que se va a copiar. Formato: |
|
|
No |
Proyecto de MaxCompute que contiene la tabla de destino. De forma predeterminada, corresponde al proyecto actual. Es obligatorio cuando las tablas de origen y destino están en proyectos distintos. |
|
|
Sí |
Nombre de la tabla de destino. Consulte la tabla de comportamiento a continuación. |
Comportamiento de la tabla de destino:
|
Condition |
Behavior |
|
La tabla de destino no existe |
Crea la tabla con la semántica de |
|
La tabla de destino existe + |
Sobrescribe los datos de la tabla de destino o de la partición especificada. |
|
La tabla de destino existe + |
Omite las particiones existentes sin sobrescribir sus datos. |
Datos de ejemplo
A continuación se muestran dos tablas de ejemplo. Ejecute los comandos indicados para crearlas y llenarlas con datos.
Tabla particionada: sale_detail
-
Cree una tabla 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 la tabla para comprobar los datos:
SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail;
Tabla no particionada: sale_detail_np
-
Cree una tabla no 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 la tabla para comprobar los datos:
SELECT * FROM sale_detail_np;
Ejemplos
Ejemplo 1: Copiar una tabla no particionada a una tabla nueva
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;
Resultado esperado:
+------------+-------------+-------------+
| shop_name | customer_id | total_price |
+------------+-------------+-------------+
| s4 | c4 | 100.4 |
+------------+-------------+-------------+
Ejemplo 2: Copiar una partición específica a una tabla 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;
Resultado esperado:
+------------+-------------+-------------+------------+------------+
| 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 |
+------------+-------------+-------------+------------+------------+
Ejemplo 3: Copiar todas las particiones y omitir las existentes
Este ejemplo continúa el caso anterior. La tabla sale_detail_clone ya contiene la partición 2013/china. Con la opción IF EXISTS IGNORE se copian las particiones restantes sin modificar la 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;
Resultado esperado:
+------------+-------------+-------------+------------+------------+
| 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 |
+------------+-------------+-------------+------------+------------+
Ejemplo 4: Copiar todas las particiones a una tabla nueva
CLONE TABLE sale_detail TO sale_detail_clone1; -- Creates sale_detail_clone1 and copies all partitions atomically
SELECT * FROM sale_detail_clone1;
Resultado esperado:
+------------+-------------+-------------+------------+------------+
| 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 |
+------------+-------------+-------------+------------+------------+
Ejemplo 5: Clonar una Delta Table
-
Clonar una Delta Table no 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 una 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;
Mejores prácticas
Para obtener información sobre cómo migrar datos entre proyectos de MaxCompute dentro de la misma región, consulte Use CLONE TABLE to migrate data between MaxCompute projects in the same region.