Todos los productos
Search
Centro de documentos

MaxCompute:CREATE TABLE

Última actualización: Sep 03, 2026

CREATE TABLE crea tablas no particionadas, particionadas, externas o agrupadas en clúster.

Límites

  • Una tabla particionada admite hasta 6 niveles de partición. Por ejemplo, una tabla particionada por fecha podría usar los niveles year/month/week/day/hour/minute.

  • De forma predeterminada, una tabla puede tener hasta 60,000 particiones. Este límite se configura por proyecto.

Para consultar otros límites de las tablas, consulte SQL limitations.

Sintaxis

Tabla interna

Crear una tabla interna (no particionada o particionada)

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type> [COMMENT <col_comment>], ...)]
[AUTO PARTITIONED 
   BY (<auto_partition_expression> [AS <auto_partition_column_name>])
  [TBLPROPERTIES('ingestion_time_partition'='true')]
];

Tabla agrupada en clúster

Crear una tabla agrupada en clúster

CREATE TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) 
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] 
INTO <number_of_buckets> BUCKETS];

Tabla externa

Crear una tabla externa

Este ejemplo crea una tabla externa de OSS mediante el analizador sintáctico de datos de texto integrado. Otros formatos se describen en ORC external table.

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( 
<col_name> <data_type>, ... ) 
STORED AS '<file_format>' 
[WITH SERDEPROPERTIES (options)]  
LOCATION '<oss_location>';

Tablas transaccionales y Delta

  • Crea una tabla transaccional. En este tipo de tabla se ejecutan operaciones UPDATE o DELETE. Sin embargo, las tablas transaccionales tienen limitaciones.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [COMMENT <table_comment>]
    [TBLPROPERTIES ("transactional"="true")];
  • Crea una tabla Delta. Al combinarla con una clave primaria, se realizan operaciones como upserts, consultas incrementales y time travel.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )]) 
    [COMMENT <table_comment>]
    [CLUSTERED BY (<pk_col_name>[, <pk_col_name2>, ...] )]
    [TBLPROPERTIES ("transactional"="true" 
    [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];
    • Una tabla Delta con clave primaria permite usar un subconjunto de dicha clave como clave de clúster hash.

      En una tabla Delta con clave primaria, el sistema utiliza agrupación en clúster hash de forma predeterminada y toma la clave primaria completa como clave de clúster. Si las consultas filtran frecuentemente por un subconjunto de columnas de la clave primaria, especifique explícitamente ese subconjunto como clave de clúster para mejorar el rendimiento del filtrado.

    • Si especifica explícitamente una clave de clúster, el sistema distribuye los datos de la tabla en buckets hash según las columnas indicadas. La clave de clúster debe ser un subconjunto de las columnas de la clave primaria.

      Si no especifica explícitamente una clave de clúster, el sistema utiliza el conjunto completo de columnas de la clave primaria como clave de clúster predeterminada.

      No es posible modificar la clave de clúster después de crear la tabla. Debe especificarla durante la creación.

Cláusulas CTAS y LIKE

  • Crea una nueva tabla basada en una existente y copia los datos, pero no copia las propiedades de partición. Esta cláusula aplica a tablas externas y a tablas en proyectos externos de Lakehouse.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;
  • Crea una nueva tabla con la misma estructura que una existente, pero sin copiar los datos. Esta cláusula aplica a tablas externas y a tablas en proyectos externos de Lakehouse.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;

Parámetros

Parámetros comunes

Parámetros generales

Parámetro

Obligatorio

Descripción

Observaciones

OR REPLACE

No

  • Si existe una tabla con el mismo nombre, se elimina y se reemplaza por la nueva tabla.

  • CREATE OR REPLACE TABLE no se puede utilizar con las siguientes cláusulas:

    • CREATE TABLE ... IF NOT EXISTS

Esto equivale a ejecutar los siguientes comandos:

DROP TABLE IF EXISTS <tableName>;  -- If the table exists, drop it.
CREATE TABLE <tableName> ...;      -- Create the new table.

EXTERNAL

No

Crea una tabla externa.

N/A

IF NOT EXISTS

No

Crea una tabla solo si no existe otra con el mismo nombre.

Sin IF NOT EXISTS, crear una tabla con un nombre duplicado devuelve un error. Con IF NOT EXISTS, la instrucción se ejecuta correctamente incluso si existe una tabla con el mismo nombre pero diferente esquema. Los metadatos de la tabla existente permanecen sin cambios.

table_name

Sí

El nombre de la tabla.

El nombre de la tabla debe tener 128 bytes o menos y contener solo letras, dígitos y guiones bajos (_). No distingue entre mayúsculas y minúsculas. Se recomienda comenzar el nombre con una letra.

PRIMARY KEY(pk)

No

La clave primaria de la tabla.

Defina una o más columnas como clave primaria para garantizar la unicidad de la combinación de columnas. Sigue la sintaxis estándar de clave primaria de SQL. Las columnas de clave primaria deben ser NOT NULL y no se pueden modificar.

Importante

Este parámetro aplica únicamente a una tabla Delta.

col_name

Sí

El nombre de la columna.

  • El nombre de la columna debe tener 128 bytes o menos y contener solo letras, dígitos, guiones bajos (_) o caracteres chinos. No distingue entre mayúsculas y minúsculas. Se recomienda comenzar el nombre con una letra.

  • Ejecute el comando SET odps.sql.bigquery.compatible=true; para habilitar el modo de compatibilidad con BigQuery. En este modo, el nombre de la columna puede tener hasta 256 bytes de longitud. De lo contrario, se devuelve un error.

col_comment

No

El comentario de la columna.

Debe ser una cadena de 1,024 bytes o menos.

data_type

Sí

El tipo de dato de la columna.

Tipos compatibles: BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, STRING y otros listados en Data types.

NOT NULL

No

Especifica que la columna no puede contener valores NULL.

Para obtener más información sobre cómo modificar la propiedad NOT NULL, consulte Partition operations.

default_value

No

El valor predeterminado para la columna.

Si una operación insert no especifica un valor para esta columna, se escribe el valor predeterminado en ella.

Nota

Funciones como GETDATE() y NOW() no son compatibles como valores predeterminados.

table_comment

No

El comentario de la tabla.

Debe ser una cadena de 1,024 bytes o menos.

LIFECYCLE

No

El ciclo de vida de la tabla, en días.

Solo se admiten enteros positivos. La unidad es días.

  • Para una tabla no particionada, el ciclo de vida comienza en el momento de la última modificación de datos. Si los datos no se modifican durante el número especificado de days, MaxCompute recupera automáticamente la tabla, lo cual equivale a una operación DROP TABLE.

  • Para una tabla particionada, el sistema determina si debe recuperar una partición según su LastModifiedTime. A diferencia de las tablas no particionadas, la tabla en sí no se elimina después de recuperar su última partición. El ciclo de vida solo se establece a nivel de tabla, no a nivel de partición.

Tablas particionadas

Parámetros de tablas particionadas

Parámetros de tablas particionadas

MaxCompute admite tablas estándar y tablas con particiones automáticas. Elija según cómo se generen las columnas de partición. Partitioned table overview.

Parámetros de tablas particionadas estándar

Parámetro

Obligatorio

Descripción

Observaciones

PARTITIONED BY

Sí

Especifica las particiones para una tabla particionada estándar.

Puede especificar particiones mediante PARTITIONED BY o AUTO PARTITIONED BY, pero no ambas.

col_name

Sí

El nombre de la columna de partición.

  • El nombre de la columna debe tener 128 bytes o menos y contener solo letras, dígitos, guiones bajos (_) o caracteres chinos. No distingue entre mayúsculas y minúsculas. Se recomienda comenzar el nombre con una letra.

  • Ejecute el comando SET odps.sql.bigquery.compatible=true; para habilitar el modo de compatibilidad con BigQuery. En este modo, el nombre de la columna puede tener hasta 256 bytes de longitud. De lo contrario, se devuelve un error.

data_type

Sí

El tipo de dato de la columna de partición.

MaxCompute V1.0 solo admite STRING. La V2.0 agrega TINYINT, SMALLINT, INT, BIGINT y VARCHAR (STRING sigue siendo compatible). Lista completa en Data types. El particionamiento elimina los escaneos completos de tabla para operaciones a nivel de partición.

col_comment

No

El comentario para la columna de partición.

Debe ser una cadena de 1,024 bytes o menos.

Nota

Un valor de partición debe tener 255 bytes o menos. No puede contener caracteres de doble byte, como caracteres chinos. El valor debe comenzar con una letra y contener solo letras, dígitos y los siguientes caracteres: espacio, dos puntos (:), guion bajo (_), signo de dólar ($), numeral (#), punto (.), signo de exclamación (!) y arroba (@). El comportamiento de otros caracteres, como los caracteres de escape \t, \n y /, no está definido.

Parámetros de tablas con particiones automáticas

Una tabla con particiones automáticas genera columnas de partición automáticamente. Los detalles de uso se encuentran en Partitioned table types.

Parámetro

Obligatorio

Descripción

Observaciones

AUTO PARTITIONED BY

Sí

Especifica las particiones para una tabla con particiones automáticas.

Puede especificar particiones mediante PARTITIONED BY o AUTO PARTITIONED BY, pero no ambas.

auto_partition_expression

Sí

La expresión que define cómo se calcula la columna de partición.

Actualmente, solo se utiliza la función TRUNC_TIME para generar la columna de partición. Solo se admite una columna de partición.

La función TRUNC_TIME trunca datos de una columna de tipo hora o fecha según una unidad de tiempo especificada para generar una columna de partición.

auto_partition_column_name

No

El nombre de la columna de partición generada.

Si no se especifica un nombre, el sistema usa _pt_col_0_ como nombre predeterminado. Si este nombre ya está en uso, el sistema incrementa el sufijo (por ejemplo, _pt_col_1_ o _pt_col_2_) hasta encontrar un nombre disponible.

Según el cálculo de la expresión de partición, se genera una columna de partición de tipo STRING. Puede especificar explícitamente un nombre para esta columna, pero no puede modificar directamente su tipo de dato ni su valor.

TBLPROPERTIES('ingestion_time_partition'='true')

No

Especifica si se generan columnas de partición según la hora de ingesta de datos.

El particionamiento por hora de ingesta se describe en Auto-partitioned tables based on data ingestion time.

Tablas agrupadas en clúster

Parámetros de tablas agrupadas en clúster

Las tablas agrupadas en clúster se clasifican en tablas agrupadas por hash y tablas agrupadas por rango.

Tabla agrupada por hash

Parámetro

Obligatorio

Descripción

Observaciones

CLUSTERED BY

Sí

Especifica la clave hash. MaxCompute calcula valores hash para las columnas especificadas y distribuye los datos en buckets hash según estos valores.

Para evitar la dispersión de datos y lograr un buen paralelismo, elija columnas con alta cardinalidad y pocos duplicados para la cláusula CLUSTERED BY. Para optimizar join, seleccione claves de unión o agregación de uso frecuente.

SORTED BY

Sí

Especifica el orden de clasificación de las columnas dentro de cada bucket hash.

Para un rendimiento óptimo, utilice las mismas columnas para SORTED BY y CLUSTERED BY. Después de especificar la cláusula SORTED BY, MaxCompute crea automáticamente un índice y lo utiliza para acelerar las consultas.

number_of_buckets

Sí

Especifica el número de buckets hash.

Este valor es obligatorio y depende del volumen de datos.

Nota

Al seleccionar el número de buckets hash, siga estos dos principios:

  • Mantenga un tamaño moderado para los buckets hash: el tamaño recomendado para cada bucket es de aproximadamente 500 MB. Por ejemplo, si el tamaño estimado de la partición es de 500 GB, establezca el número de buckets en 1,000. Esto resulta en un tamaño promedio de bucket hash de unos 500 MB. Para tablas muy grandes, puede exceder el límite de 500 MB. Un tamaño de 2 GB a 3 GB por bucket es adecuado.

  • Para optimizar las operaciones join, eliminar los pasos de shuffle y clasificación mejora significativamente el rendimiento. Esto requiere que el número de buckets hash en las dos tablas sea múltiplo entre sí, por ejemplo, 256 y 512. Se recomienda establecer el número de buckets hash como una potencia de 2 (2n), como 512, 1024, 2048 o 4096. Esto permite al sistema dividir o fusionar automáticamente los buckets hash y eliminar los pasos de shuffle y clasificación, lo que mejora la eficiencia de ejecución.

Tabla agrupada por rango

Parámetro

Obligatorio

Descripción

Observaciones

RANGE CLUSTERED BY

Sí

Especifica las columnas de agrupación por rango.

MaxCompute realiza operaciones de bucketing en las columnas especificadas y distribuye los datos en buckets según los números de bucket.

SORTED BY

Sí

Especifica el orden de clasificación de las columnas dentro de cada bucket.

El uso es el mismo que para una tabla agrupada por hash.

number_of_buckets

Sí

Especifica el número de buckets.

Para una tabla agrupada por rango, no es necesaria la práctica recomendada de potencia de 2 (2n) que aplica a las tablas agrupadas por hash. Cualquier número de buckets es aceptable si los datos están distribuidos uniformemente. Este parámetro es opcional para tablas agrupadas por rango. Si lo omite, el sistema determina automáticamente el número óptimo de buckets según el volumen de datos.

Cuando se realiza una operación de unión o agregación en una tabla agrupada por rango, si la clave de unión o de grupo es la clave de agrupación por rango o su prefijo, puede eliminar la redistribución de datos (shuffle remove) para mejorar el rendimiento. Ejecute el comando set odps.optimizer.enable.range.partial.repartitioning=true/false; para habilitar o deshabilitar esta función. Está deshabilitada de forma predeterminada.

Nota
  • Beneficios de las tablas agrupadas en clúster:

    • Poda de buckets optimizada

    • Agregaciones optimizadas

    • Almacenamiento optimizado

  • Limitaciones de las tablas agrupadas en clúster:

    • INSERT INTO no es compatible. Solo puede agregar datos mediante INSERT OVERWRITE.

    • No se admite la carga directa de datos a una tabla agrupada por rango mediante Tunnel, ya que Tunnel carga los datos sin orden específico.

    • Las funciones de copia de seguridad y recuperación no son compatibles.

Tablas externas

Parámetros de tablas externas

Esta sección cubre los parámetros de tablas externas de OSS. Otros tipos de tablas externas se documentan en External tables.

Parámetro

Obligatorio

Descripción

STORED AS '<file_format>'

Sí

Especifica file_format según el formato de datos de la tabla externa.

WITH SERDEPROPERTIES(options)

No

Especifica parámetros relacionados con autorización, compresión y análisis sintáctico de caracteres para la tabla externa.

oss_location

Sí

La ubicación de almacenamiento en OSS de los datos de la tabla externa. Para obtener más información, consulte OSS external tables.

Tablas transaccionales y Delta

Parámetros de tablas transaccionales y Delta

Parámetros de tablas Delta

Una tabla Delta es un formato de tabla que admite lecturas y escrituras casi en tiempo real, almacenamiento y acceso incremental, y actualizaciones en tiempo real. Actualmente, solo se admiten tablas con clave primaria.

Parámetro

Obligatorio

Descripción

Observaciones

PRIMARY KEY(PK)

Sí

Define la clave primaria para la tabla Delta, la cual puede incluir varias columnas.

La sintaxis sigue la sintaxis estándar de clave primaria de SQL. Las columnas de clave primaria deben configurarse como NOT NULL y no se pueden modificar. Una vez establecida la clave primaria, los datos se deduplican según las columnas de dicha clave. La restricción de unicidad se aplica dentro de una sola partición o dentro de una tabla no particionada.

transactional

Sí

Obligatorio para crear una tabla Delta. Debe establecer este parámetro en true.

Indica que la tabla admite las propiedades transaccionales de las tablas ACID de MaxCompute. La tabla utiliza el modelo de control de concurrencia multiversión (MVCC) para garantizar el nivel de aislamiento de instantánea.

write.bucket.num

No

El valor predeterminado es 16. El rango válido es (0, 4096].

Especifica el número de buckets para cada partición o para una tabla no particionada. Esto también indica el número de nodos concurrentes para escrituras de datos. Puede modificar este parámetro para una tabla particionada, y la nueva configuración surte efecto para nuevas particiones. No puede modificar este parámetro para una tabla no particionada. Considere las siguientes recomendaciones:

  • Si importa datos mediante Tunnel, este parámetro especifica el número de nodos Tunnel concurrentes. La configuración afecta el tráfico de importación y también está limitada por el número máximo de nodos Tunnel concurrentes.

  • Si escribe datos mediante SQL, este parámetro especifica el grado de concurrencia para los reducers. Esto está limitado por el número máximo de nodos reducer concurrentes.

  • El tamaño recomendado para cada bucket es de aproximadamente 500 MB de datos. Por ejemplo, si el tamaño estimado de la partición es de 500 GB, establezca el número de buckets en 1,000. Para tablas muy grandes, puede aumentar el tamaño del bucket a 2 GB o 3 GB.

acid.data.retain.hours

No

El valor predeterminado es 24. El rango válido es [24, 168].

Especifica el intervalo de tiempo en horas durante el cual puede consultar estados históricos de datos mediante Time Travel. Si necesita un historial de Time Travel superior a 168 horas (7 días), póngase en contacto con el soporte técnico de MaxCompute.

  • Un valor de 0 indica que no se conserva el estado histórico de los datos y que las consultas de Time Travel no son compatibles.

  • Los datos históricos anteriores al valor especificado pueden eliminarse o compactarse.

  • Si una consulta de Time Travel especifica una hora anterior al rango permitido definido por este parámetro, se devuelve un error. Por ejemplo, si este valor es 72, falla una consulta de datos de hace más de 72 horas.

acid.incremental.query.out.of.time.range.enabled

No

Valor predeterminado: false.

Si es true, el endTimestamp en una consulta incremental puede ser posterior a la hora de confirmación de datos más reciente de la tabla. En este caso, múltiples consultas pueden devolver resultados diferentes porque podrían insertarse nuevos datos. Puede modificar el valor de este parámetro para una tabla existente.

acid.write.precombine.field

No

Especifica un único nombre de columna.

Si se especifica un nombre de columna, el sistema utiliza esta columna junto con las columnas de clave primaria para deduplicar datos dentro de la misma confirmación. Esto garantiza la unicidad y consistencia de los datos.

Nota

Si una sola confirmación de datos supera los 128 MB, se generan varios archivos. Este parámetro no aplica a través de múltiples archivos.

acid.partial.fields.update.enable

No

Si se establece en true, puede realizar una partial column update en la tabla Delta mediante SQL o Tunnel.

Este parámetro se establece al crear la tabla. No se puede modificar después de crear la tabla.

  • Otros requisitos de parámetros para tablas Delta:

    • LIFECYCLE: El ciclo de vida de la tabla debe ser mayor o igual al período de retención de time travel, es decir, lifecycle >= acid.data.retain.hours / 24. Se realiza una comprobación al crear la tabla y se reporta un error si no se cumple esta condición.

    • Funciones no compatibles: CLUSTERED BY, EXTERNAL y CREATE TABLE AS no son compatibles.

  • Otras limitaciones:

    • Actualmente, otros motores no pueden operar directamente sobre una tabla Delta. Solo se admite MaxCompute SQL.

    • No puede convertir una tabla estándar en una tabla Delta.

    • No puede realizar cambios de esquema en las columnas de clave primaria de una tabla Delta.

Parámetros de tablas transaccionales

Parámetro

Obligatorio

Descripción

TBLPROPERTIES("transactional"="true")

Sí

Establece la tabla como una tabla transaccional, lo que habilita operaciones update y delete a nivel de fila. UPDATE | DELETE[Update or delete data (UPDATE

DELETE)](t2043562.dita#concept_2043562).

Las siguientes limitaciones aplican a una tabla transaccional:

  • Solo puede establecer la propiedad transactional al crear una tabla. No puede usar ALTER TABLE para modificar esta propiedad en una tabla existente. La siguiente instrucción devuelve un error:

    ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true");
    -- Error returned.
    FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported
  • No puede configurar una tabla agrupada en clúster o una tabla externa como tabla transaccional.

  • No puede convertir una tabla interna estándar, una tabla externa o una tabla agrupada en clúster en una tabla transaccional, ni viceversa.

  • La compactación automática no es compatible. Compacte manualmente los archivos como se describe en Compact files in a Transactional Table.

  • La operación merge partition no es compatible.

  • El acceso a tablas transaccionales desde otros sistemas es limitado. Por ejemplo, MaxCompute Graph no admite operaciones de lectura ni escritura. Spark y PAI solo admiten operaciones de lectura.

  • Antes de realizar operaciones update, delete o insert overwrite sobre datos importantes, haga una copia de seguridad manual en otra tabla mediante una instrucción SELECT ... INSERT.

Crear tablas a partir de tablas existentes

Crear tabla (a partir de una existente)

  • Utilice la instrucción CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; para crear otra tabla y copiar datos en ella simultáneamente.

    • Esta instrucción no copia las propiedades de partición. Las columnas de partición de la tabla de origen se tratan como columnas normales en la tabla de destino. Tampoco se copia la propiedad de ciclo de vida de la tabla de origen.

    • Use el parámetro lifecycle para especificar un ciclo de vida para la nueva tabla. Esta instrucción también permite crear una tabla interna y copiar datos desde una tabla externa.

  • Utilice la instrucción CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>; para crear una nueva tabla con el mismo esquema que una tabla existente.

    • Esta instrucción copia el esquema, pero no copia los datos ni la propiedad de ciclo de vida de la tabla de origen.

    • Use el parámetro lifecycle para especificar un ciclo de vida para la nueva tabla. Esta instrucción también permite crear una tabla interna que copie el esquema de una tabla externa.

Ejemplos

Tabla sin particiones

  • Cree una tabla sin particiones.

    CREATE TABLE test1 (key STRING);
  • Cree una tabla sin particiones y especifique valores predeterminados para las columnas.

    CREATE TABLE test_default( 
    tinyint_name tinyint NOT NULL default 1Y,
    smallint_name SMALLINT NOT NULL DEFAULT 1S,
    int_name INT NOT NULL DEFAULT 1,
    bigint_name BIGINT NOT NULL DEFAULT 1,
    binary_name BINARY ,
    float_name FLOAT ,
    double_name DOUBLE NOT NULL DEFAULT 0.1,
    decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD,
    varchar_name VARCHAR(10) ,
    char_name CHAR(2) ,
    string_name STRING NOT NULL DEFAULT 'N',
    boolean_name BOOLEAN NOT NULL DEFAULT TRUE
    );

Tabla con particiones

  • Cree una tabla con particiones estándar.

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
  • Cree una tabla con particiones AUTO PARTITION que genere particiones basadas en una columna de datos temporales mediante una función de tiempo.

    -- The sale_date column is truncated by month to generate a partition column named sale_month. The table is then partitioned by this column.
    CREATE TABLE IF NOT EXISTS auto_sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     sale_date    DATE )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month);
  • Cree una tabla con particiones AUTO PARTITION que genere particiones basadas en el momento de ingesta de datos. El sistema recupera automáticamente la hora en que los datos se escriben en MaxCompute y genera particiones mediante una función de tiempo.

    -- After the table is created, when data is written, the system automatically captures the data ingestion time (_partitiontime), truncates it by day, generates a partition column named sale_date, and then partitions the table by this column.
    CREATE TABLE IF NOT EXISTS auto_sale_detail2(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     _partitiontime TIMESTAMP_NTZ)
    AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date)
    TBLPROPERTIES('ingestion_time_partition'='true');

Tabla agrupada por hash o rango

  • Cree una tabla sin particiones agrupada por hash.

    CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Cree una tabla con particiones agrupada por hash.

    CREATE TABLE t2 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Cree una tabla sin particiones agrupada por rango.

    CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Cree una tabla con particiones agrupada por rango.

    CREATE TABLE t4 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) RANGE CLUSTERED BY (c) SORTED BY (c); 

Tabla transaccional

  • Cree una tabla transaccional sin particiones.

    CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true");
  • Cree una tabla transaccional con particiones.

    CREATE TABLE IF NOT EXISTS t6(id BIGINT) 
    PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");

Tabla interna

  • Cree una tabla interna copiando datos de una tabla externa con particiones. La tabla interna no incluirá propiedades de partición.

    1. Cree una tabla externa de OSS y una tabla interna de MaxCompute. Cree una tabla interna mediante CREATE TABLE AS.

      -- Create an OSS external table and insert data into it.
      CREATE EXTERNAL TABLE max_oss_test(a INT, b INT, c INT) 
      STORED AS TEXTFILE
      LOCATION "oss://oss-cn-hangzhou-internal.aliyuncs.com/<bucket_name>";
      
      INSERT INTO max_oss_test VALUES 
      (101, 1, 20241108),
      (102, 2, 20241109),
      (103, 3, 20241110);
      
      SELECT * FROM max_oss_test;
      
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      -- Create an internal table by using CREATE TABLE AS.
      CREATE TABLE from_exetbl_oss AS SELECT * FROM max_oss_test;
      
      -- Query the new internal table.
      SELECT * FROM from_exetbl_oss;
      
      -- The result shows that all data is copied.
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
    2. Ejecute el comando DESC from_exetbl_oss; para consultar el esquema de la tabla interna. El comando devuelve la siguiente salida.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$***********                                       |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:16:33                                      |
      | LastDDLTime:              2023-01-10 15:16:33                                      |
      | LastModifiedTime:         2023-01-10 15:16:33                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 919                                                |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      | c               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
  • Cree una tabla interna copiando el esquema de una tabla externa con particiones. La tabla interna incluye propiedades de partición.

    1. Cree la tabla interna from_exetbl_like. Consulte la tabla externa de OSS desde MaxCompute. Cree una tabla interna mediante CREATE TABLE LIKE.

      -- Query the OSS external table from MaxCompute.
      SELECT * FROM max_oss_test;
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      -- Create an internal table by using CREATE TABLE LIKE.
      CREATE TABLE from_exetbl_like LIKE max_oss_test;
      
      -- Query the new internal table.
      SELECT * FROM from_exetbl_like;
      -- Result: Only the table schema is returned.
      a    b    c
    2. Ejecute el comando DESC from_exetbl_like; para consultar el esquema de la tabla interna. El comando devuelve la siguiente salida.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$************                                      |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:09:47                                      |
      | LastDDLTime:              2023-01-10 15:09:47                                      |
      | LastModifiedTime:         2023-01-10 15:09:47                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 0                                                  |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
      | Partition Columns:                                                                 |
      +------------------------------------------------------------------------------------+
      | c               | string     |                                                     |
      +------------------------------------------------------------------------------------+

Tabla Delta

  • Cree una tabla Delta.

    CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
      TBLPROPERTIES ("transactional"="true");
  • Cree una tabla Delta y establezca propiedades clave de la tabla.

    CREATE TABLE mf_tt2 ( 
      pk BIGINT NOT NULL, 
      pk2 BIGINT NOT NULL, 
      val BIGINT, 
      val2 BIGINT, 
      PRIMARY KEY (pk, pk2)
    ) 
    TBLPROPERTIES (
      "transactional"="true", 
      "write.bucket.num" = "64", 
      "acid.data.retain.hours"="120"
    ) LIFECYCLE 7;

Otros métodos

Reemplazar una tabla existente

  1. Cree la tabla original my_table e inserte datos en ella.

    CREATE OR REPLACE TABLE my_table(a BIGINT);
    
    INSERT INTO my_table(a) VALUES (1),(2),(3);
  2. Use OR REPLACE para crear una nueva tabla con el mismo nombre y modificar sus columnas.

    CREATE OR REPLACE TABLE my_table(b STRING);
  3. Consulte la tabla my_table. La consulta devuelve el siguiente resultado.

    +------------+
    | b          | 
    +------------+
    +------------+

    Las siguientes instrucciones SQL no son válidas:

    CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING);
    CREATE OR REPLACE TABLE my_table AS SELECT;
    CREATE OR REPLACE TABLE my_table LIKE newtable;

Copiar datos y establecer un ciclo de vida

-- Create a new table named sale_detail_ctas1, copy the data from sale_detail to it, and set a lifecycle.
SET odps.sql.allow.fullscan=true;
CREATE TABLE sale_detail_ctas1 LIFECYCLE 10 AS SELECT * FROM sale_detail;

Ejecute el comando DESC EXTENDED sale_detail_ctas1; para consultar detalles como el esquema y el ciclo de vida de la tabla.

Nota

En este ejemplo, sale_detail es una tabla con particiones. Cuando utiliza la instrucción CREATE TABLE ... AS select_statement ... para crear la tabla sale_detail_ctas1, las propiedades de partición no se copian. Las columnas de partición de la tabla de origen se convierten en columnas normales en la tabla de destino. Por lo tanto, sale_detail_ctas1 es una tabla sin particiones con cinco columnas.

Usar constantes para valores de columna

Nota

Si utiliza constantes como valores de columna en la cláusula SELECT, especifique nombres de columna. De lo contrario, la cuarta y quinta columnas de la tabla creada sale_detail_ctas3 recibirán nombres predeterminados como _c4 y _c5.

  • Especifique nombres de columna.

    SET odps.sql.allow.fullscan=true;
    CREATE TABLE sale_detail_ctas2
    AS
    SELECT shop_name, customer_id, total_price, '2013' AS sale_date, 'China' AS region
    FROM sale_detail;
  • No especifique nombres de columna.

    SET odps.sql.allow.fullscan=true;
    
    CREATE TABLE sale_detail_ctas3
    AS
    SELECT shop_name, customer_id, total_price, '2013', 'China' 
    FROM sale_detail;

Copiar un esquema y establecer un ciclo de vida

CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;

Ejecute el comando DESC EXTENDED sale_detail_like; para consultar detalles como el esquema y el ciclo de vida de la tabla.

Nota

El esquema de sale_detail_like es idéntico al esquema de sale_detail. Se copian todas las propiedades, como nombres de columna, comentarios de columna y comentarios de tabla, excepto la propiedad de ciclo de vida. Sin embargo, los datos de sale_detail no se copian a la tabla sale_detail_like.

Copiar un esquema de una tabla externa

-- Create a new table named mc_oss_extable_orc_like that has the same schema as the external table mc_oss_extable_orc.
CREATE TABLE mc_oss_extable_orc_like LIKE mc_oss_extable_orc;

Ejecute el comando DESC mc_oss_extable_orc_like; para consultar detalles como el esquema de la tabla.

+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@***.aliyunid.com | Project: max_compute_7u************yoq              |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2022-08-11 11:10:47                                      |
| LastDDLTime:              2022-08-11 11:10:47                                      |
| LastModifiedTime:         2022-08-11 11:10:47                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 0                                                  |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| id              | string     |       |                                             |
| name            | string     |       |                                             |
+------------------------------------------------------------------------------------+

Nuevos tipos de datos

SET odps.sql.type.system.odps2=true;
CREATE TABLE test_newtype (
    c1 TINYINT,
    c2 SMALLINT,
    c3 INT,
    c4 BIGINT,
    c5 FLOAT,
    c6 DOUBLE,
    c7 DECIMAL,
    c8 BINARY,
    c9 TIMESTAMP,
    c10 ARRAY<MAP<BIGINT,BIGINT>>,
    c11 MAP<STRING,ARRAY<BIGINT>>,
    c12 STRUCT<s1:STRING,s2:BIGINT>,
    c13 VARCHAR(20))
LIFECYCLE 1;

Comandos relacionados

  • ALTER TABLE: Modifica la estructura o las propiedades de una tabla.

  • TRUNCATE TABLE: Elimina todos los datos de una tabla.

  • DROP TABLE: Elimina una tabla.

  • DESC TABLE/VIEW: Muestra información sobre una tabla interna, vista, vista materializada, tabla externa, tabla agrupada o tabla transaccional de MaxCompute.

  • SHOW: Muestra la instrucción DDL de SQL para una tabla, todas las tablas y vistas de un proyecto, o todas las particiones de una tabla.