Todos los productos
Search
Centro de documentos

MaxCompute:CLONE TABLE

Última actualización: Sep 22, 2026

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 TABLE para 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 TABLE para crear una nueva tabla transaccional.

  • Tablas externas: CLONE TABLE no permite copiar datos desde tablas externas.

  • Control de acceso a nivel de fila o enmascaramiento de datos:

    No se puede usar CLONE TABLE en tablas que tengan aplicada una Row Access Policy o una Data Masking Policy.

  • Operaciones entre regiones:

    CLONE TABLE no 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 TABLE no 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 AS para migrar los datos.

    • Tablas particionadas: cree la tabla con CREATE TABLE LIKE y luego migre los datos con INSERT OVERWRITE.

  • Schema Evolution:

    No se puede usar CLONE TABLE en 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

src_project_name

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.

src_table_name

Sí

Nombre de la tabla de origen.

pt_spec

No

Partición que se va a copiar. Formato: partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...

dest_project_name

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.

dest_table_name

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 CREATE TABLE LIKE y después copia los datos. Para más información, consulte Crear una tabla.

La tabla de destino existe + IF EXISTS OVERWRITE

Sobrescribe los datos de la tabla de destino o de la partición especificada.

La tabla de destino existe + IF EXISTS IGNORE

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

  1. 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);
  2. Consulte la tabla para comprobar los datos:

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

    View results

    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   |
    +------------+-------------+-------------+------------+------------+

Tabla no particionada: sale_detail_np

  1. 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);
  2. Consulte la tabla para comprobar los datos:

    SELECT * FROM sale_detail_np;

    View results

    Resultado esperado:

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

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.