Todos os produtos
Search
Central de documentação

MaxCompute:CREATE TABLE

Última atualização: Jun 26, 2026

O comando CREATE TABLE cria tabelas não particionadas, particionadas, externas ou clusterizadas.

Limites

  • Uma tabela particionada pode ter até 6 níveis de partição. Por exemplo, uma tabela particionada por data pode usar os níveis year/month/week/day/hour/minute.

  • Por padrão, uma tabela pode ter até 60.000 partições. Esse limite é configurável por projeto.

Para outros limites de tabela, consulte Limitações do SQL.

Sintaxe

Tabela interna

Crie uma tabela interna (não particionada ou 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')]
];

Tabela clusterizada

Crie uma tabela clusterizada

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];

Tabela externa

Crie uma tabela externa

Este exemplo cria uma tabela externa do OSS usando o analisador de dados de texto integrado. Outros formatos são abordados em Tabela externa ORC.

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

Tabelas transacionais e Delta

  • Cria uma tabela transacional. É possível executar operações UPDATE ou DELETE nesse tipo de tabela. No entanto, tabelas transacionais possuem limitações.

    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")];
  • Cria uma tabela Delta. Quando combinada com uma chave primária, permite realizar operações como upserts, consultas incrementais e 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>];
    • Uma tabela Delta com chave primária permite usar um subconjunto da chave primária como chave de cluster hash.

      Em uma tabela Delta com chave primária, o sistema usa clustering hash por padrão, utilizando a chave primária completa como chave de cluster. Se as consultas filtrarem frequentemente por um subconjunto de colunas da chave primária, especifique explicitamente esse subconjunto como chave de cluster para melhorar o desempenho da filtragem.

    • Se você especificar explicitamente uma chave de cluster, o sistema distribui os dados da tabela em buckets hash com base nas colunas especificadas. A chave de cluster deve ser um subconjunto das colunas da chave primária.

      Caso nenhuma chave de cluster seja especificada explicitamente, o sistema utiliza o conjunto completo de colunas da chave primária como chave de cluster padrão.

      Não é possível modificar a chave de cluster após a criação da tabela. Defina-a no momento da criação.

Cláusulas CTAS e LIKE

  • Cria uma nova tabela baseada em uma tabela existente e copia os dados, mas não copia as propriedades de partição. Esta cláusula aplica-se a tabelas externas e a tabelas em projetos Lakehouse externos.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;
  • Cria uma nova tabela com a mesma estrutura de uma tabela existente, mas sem copiar os dados. Esta cláusula aplica-se a tabelas externas e a tabelas em projetos Lakehouse externos.

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

Parâmetros

Parâmetros comuns

Parâmetros gerais

Parâmetro

Obrigatório

Descrição

Observações

OR REPLACE

Não

  • Se já existir uma tabela com o mesmo nome, ela será removida e substituída pela nova tabela.

  • CREATE OR REPLACE TABLE não pode ser usado com as seguintes cláusulas:

    • CREATE TABLE ... IF NOT EXISTS

Isso equivale a executar os seguintes comandos:

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

EXTERNAL

Não

Cria uma tabela externa.

N/A

IF NOT EXISTS

Não

Cria uma tabela apenas se não existir outra com o mesmo nome.

Sem IF NOT EXISTS, a criação de uma tabela com nome duplicado retorna um erro. Com IF NOT EXISTS, a instrução é bem-sucedida mesmo que exista uma tabela com o mesmo nome, mas com esquema diferente. Os metadados da tabela existente permanecem inalterados.

table_name

Sim

O nome da tabela.

O nome da tabela deve ter no máximo 128 bytes e conter apenas letras, dígitos e underscores (_). Não diferencia maiúsculas de minúsculas. Recomenda-se iniciar o nome com uma letra.

PRIMARY KEY(pk)

Não

A chave primária da tabela.

Defina uma ou mais colunas como chave primária para garantir a unicidade da combinação de colunas. Segue a sintaxe padrão de chave primária SQL. As colunas da chave primária devem ser NOT NULL e não podem ser modificadas.

Importante

Este parâmetro aplica-se apenas a uma Delta Table.

col_name

Sim

O nome da coluna.

  • O nome da coluna deve ter no máximo 128 bytes e conter apenas letras, dígitos, underscores (_) ou caracteres chineses. Não diferencia maiúsculas de minúsculas. Recomenda-se iniciar o nome com uma letra.

  • Execute o comando SET odps.sql.bigquery.compatible=true; para ativar o modo de compatibilidade com BigQuery. Nesse modo, o nome da coluna pode ter até 256 bytes. Caso contrário, um erro será retornado.

col_comment

Não

O comentário da coluna.

Deve ser uma string de no máximo 1.024 bytes.

data_type

Sim

O tipo de dados da coluna.

Tipos suportados: BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, STRING e outros listados em Tipos de dados.

NOT NULL

Não

Especifica que a coluna não pode conter valores NULL.

Para mais informações sobre como modificar a propriedade NOT NULL, consulte Operações de partição.

default_value

Não

O valor padrão para a coluna.

Se uma operação insert não especificar um valor para esta coluna, o valor padrão será gravado nela.

Nota

Funções como GETDATE() e NOW() não são suportadas como valores padrão.

table_comment

Não

O comentário da tabela.

Deve ser uma string de no máximo 1.024 bytes.

LIFECYCLE

Não

O ciclo de vida da tabela, em dias.

Apenas inteiros positivos são suportados. A unidade é dias.

  • Para uma tabela não particionada, o ciclo de vida começa no momento da última modificação dos dados. Se os dados não forem modificados pelo número especificado de dias, o MaxCompute recupera automaticamente a tabela, o que equivale a uma operação DROP TABLE.

  • Para uma tabela particionada, o sistema determina se deve recuperar uma partição com base em seu LastModifiedTime. Diferentemente das tabelas não particionadas, a tabela em si não é excluída após a recuperação de sua última partição. O ciclo de vida pode ser definido apenas no nível da tabela, não no nível da partição.

Tabelas particionadas

Parâmetros de tabela particionada

Parâmetros de tabela particionada

O MaxCompute suporta tabelas com particionamento padrão e automático. Escolha o tipo com base na forma como as colunas de partição são geradas. Visão geral de tabelas particionadas.

Parâmetros de tabela com particionamento padrão

Parâmetro

Obrigatório

Descrição

Observações

PARTITIONED BY

Sim

Especifica as partições para uma tabela com particionamento padrão.

Você pode especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos simultaneamente.

col_name

Sim

O nome da coluna de partição.

  • O nome da coluna deve ter no máximo 128 bytes e conter apenas letras, dígitos, underscores (_) ou caracteres chineses. Não diferencia maiúsculas de minúsculas. Recomenda-se iniciar o nome com uma letra.

  • Execute o comando SET odps.sql.bigquery.compatible=true; para ativar o modo de compatibilidade com BigQuery. Nesse modo, o nome da coluna pode ter até 256 bytes. Caso contrário, um erro será retornado.

data_type

Sim

O tipo de dados da coluna de partição.

O MaxCompute V1.0 suporta apenas STRING. A versão V2.0 adiciona TINYINT, SMALLINT, INT, BIGINT e VARCHAR (STRING continua suportado). Lista completa em Tipos de dados. O particionamento elimina varreduras completas de tabela para operações no nível de partição.

col_comment

Não

O comentário para a coluna de partição.

Deve ser uma string de no máximo 1.024 bytes.

Nota

Um valor de partição deve ter no máximo 255 bytes. Não pode conter caracteres de byte duplo, como caracteres chineses. O valor deve começar com uma letra e conter apenas letras, dígitos e os seguintes caracteres: espaço, dois pontos (:), underscore (_), cifrão ($), cerquilha (#), ponto (.), ponto de exclamação (!) e arroba (@). O comportamento de outros caracteres, como os caracteres de escape \t, \n e /, é indefinido.

Parâmetros de tabela com particionamento automático

Uma tabela com particionamento automático gera colunas de partição automaticamente. Detalhes de uso estão em Tipos de tabelas particionadas.

Parâmetro

Obrigatório

Descrição

Observações

AUTO PARTITIONED BY

Sim

Especifica as partições para uma tabela com particionamento automático.

Você pode especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos simultaneamente.

auto_partition_expression

Sim

A expressão que define como a coluna de partição é calculada.

Atualmente, apenas a função TRUNC_TIME pode ser usada para gerar a coluna de partição. Apenas uma coluna de partição é suportada.

A função TRUNC_TIME pode truncar dados de uma coluna de tipo tempo ou data com base em uma unidade de tempo especificada para gerar uma coluna de partição.

auto_partition_column_name

Não

O nome da coluna de partição gerada.

Se nenhum nome for especificado, o sistema usa _pt_col_0_ como nome padrão. Se este nome já estiver em uso, o sistema incrementa o sufixo (por exemplo, _pt_col_1_ ou _pt_col_2_) até encontrar um nome não utilizado.

Com base no cálculo da expressão de partição, uma coluna de partição do tipo STRING é gerada. Você pode especificar explicitamente um nome para esta coluna, mas não pode modificar diretamente seu tipo de dados ou valor.

TBLPROPERTIES('ingestion_time_partition'='true')

Não

Especifica se as colunas de partição devem ser geradas com base no tempo de ingestão de dados.

O particionamento por tempo de ingestão é descrito em Tabelas com particionamento automático baseadas no tempo de ingestão de dados.

Tabelas clusterizadas

Parâmetros de tabela clusterizada

As tabelas clusterizadas são categorizadas em tabelas com cluster hash e tabelas com cluster por intervalo.

Tabela com cluster hash

Parâmetro

Obrigatório

Descrição

Observações

CLUSTERED BY

Sim

Especifica a chave hash. O MaxCompute calcula valores hash para as colunas especificadas e distribui os dados em buckets hash com base nesses valores.

Para evitar skew de dados e obter bom paralelismo, escolha colunas com alta cardinalidade e poucos duplicatas para a cláusula CLUSTERED BY. Para otimização de join, selecione chaves de junção ou agregação usadas frequentemente.

SORTED BY

Sim

Especifica a ordem de classificação das colunas dentro de cada bucket hash.

Para desempenho ideal, use as mesmas colunas para SORTED BY e CLUSTERED BY. Após especificar a cláusula SORTED BY, o MaxCompute cria automaticamente um índice e o utiliza para acelerar consultas.

number_of_buckets

Sim

Especifica o número de buckets hash.

Este valor é obrigatório e depende do volume de dados. Por padrão, o MaxCompute suporta no máximo 1.111 reducers, o que limita o número de buckets hash a 1.111. Você pode executar o comando set odps.stage.reducer.num =<concurrency>; para aumentar esse limite, mas o valor não pode exceder 4.000. Um valor muito alto pode degradar o desempenho.

Nota

Ao selecionar o número de buckets hash, siga estes dois princípios:

  • Mantenha o tamanho do bucket hash moderado: O tamanho recomendado para cada bucket hash é de aproximadamente 500 MB. Por exemplo, se o tamanho estimado da partição for 500 GB, defina o número de buckets como 1.000. Isso resulta em um tamanho médio de bucket hash de cerca de 500 MB. Para tabelas muito grandes, você pode exceder o limite de 500 MB. Um tamanho de 2 GB a 3 GB por bucket é adequado. Você também pode executar o comando set odps.stage.reducer.num=<concurrency>; para ultrapassar o limite de 1.111 buckets hash.

  • Para otimizar operações de join, remover as etapas de shuffle e sort melhora significativamente o desempenho. Isso requer que o número de buckets hash nas duas tabelas seja múltiplo um do outro, por exemplo, 256 e 512. Recomenda-se definir o número de buckets hash como uma potência de 2 (2n), como 512, 1024, 2048 ou 4096. Isso permite que o sistema divida ou mescle buckets hash automaticamente e remova as etapas de shuffle e sort, melhorando a eficiência da execução.

Tabela com cluster por intervalo

Parâmetro

Obrigatório

Descrição

Observações

RANGE CLUSTERED BY

Sim

Especifica as colunas de cluster por intervalo.

O MaxCompute executa operações de bucketing nas colunas especificadas e distribui os dados em buckets com base nos números dos buckets.

SORTED BY

Sim

Especifica a ordem de classificação das colunas dentro de cada bucket.

O uso é o mesmo que para uma tabela com cluster hash.

number_of_buckets

Sim

Especifica o número de buckets.

Para uma tabela com cluster por intervalo, a prática recomendada de potência de 2 (2n) aplicável a tabelas com cluster hash não é necessária. Qualquer número de buckets é aceitável se os dados estiverem distribuídos uniformemente. Este parâmetro é opcional para tabelas com cluster por intervalo. Se omitido, o sistema determina automaticamente o número ideal de buckets com base no volume de dados.

Quando uma operação de junção ou agregação é realizada em uma tabela com cluster por intervalo, se a chave de junção ou de grupo for a chave de cluster por intervalo ou seu prefixo, é possível eliminar a redistribuição de dados (shuffle remove) para melhorar o desempenho. Você pode executar o comando set odps.optimizer.enable.range.partial.repartitioning=true/false; para ativar ou desativar esse recurso. Ele está desativado por padrão.

Nota
  • Benefícios das tabelas clusterizadas:

    • Pruning de buckets otimizado

    • Agregações otimizadas

    • Armazenamento otimizado

  • Limitações das tabelas clusterizadas:

    • INSERT INTO não é suportado. Você pode adicionar dados apenas usando INSERT OVERWRITE.

    • O upload direto de dados para uma tabela com cluster por intervalo via Tunnel não é suportado, pois o Tunnel faz upload de dados de maneira não ordenada.

    • Recursos de backup e recuperação não são suportados.

Tabelas externas

Parâmetros de tabela externa

Esta seção aborda os parâmetros de tabelas externas do OSS. Outros tipos de tabelas externas estão documentados em Tabelas externas.

Parâmetro

Obrigatório

Descrição

STORED AS '<file_format>'

Sim

Especifica o file_format com base no formato de dados da tabela externa.

WITH SERDEPROPERTIES(options)

Não

Especifica parâmetros relacionados a autorização, compressão e análise de caracteres para a tabela externa.

oss_location

Sim

O local de armazenamento no OSS dos dados da tabela externa. Para mais informações, consulte Tabelas externas do OSS.

Tabelas transacionais e Delta

Parâmetros de Transactional Table e Delta Table

Parâmetros de Delta Table

Uma Delta Table é um formato de tabela que suporta leituras e gravações quase em tempo real, armazenamento e acesso incrementais e atualizações em tempo real. Atualmente, apenas tabelas com chave primária são suportadas.

Parâmetro

Obrigatório

Descrição

Observações

PRIMARY KEY(PK)

Sim

Define a chave primária para a Delta Table, que pode incluir várias colunas.

A sintaxe segue o padrão SQL para chaves primárias. As colunas da chave primária devem ser definidas como NOT NULL e não podem ser modificadas. Após a definição da chave primária, os dados são deduplicados com base nas colunas da chave primária. A restrição de unicidade é aplicada dentro de uma única partição ou dentro de uma tabela não particionada.

transactional

Sim

Obrigatório para criar uma Delta Table. Você deve definir este parâmetro como true.

Indica que a tabela suporta as propriedades transacionais das tabelas ACID do MaxCompute. A tabela usa o modelo Multi-Version Concurrency Control (MVCC) para garantir o nível de isolamento de snapshot.

write.bucket.num

Não

O valor padrão é 16. O intervalo válido é (0, 4096].

Especifica o número de buckets para cada partição ou para uma tabela não particionada. Isso também indica o número de nós concorrentes para gravação de dados. Você pode modificar este parâmetro para uma tabela particionada, e a nova configuração entra em vigor para novas partições. Não é possível modificar este parâmetro para uma tabela não particionada. Considere as seguintes recomendações:

  • Se você importar dados usando Tunnel, este parâmetro especifica o número de nós Tunnel concorrentes. A configuração afeta o tráfego de importação e também é restrita pelo número máximo de nós Tunnel concorrentes.

  • Se você gravar dados usando SQL, este parâmetro especifica o grau de concorrência para reducers. Isso é restrito pelo número máximo de nós reducer concorrentes.

  • O tamanho recomendado para cada bucket é de aproximadamente 500 MB de dados. Por exemplo, se o tamanho estimado da partição for 500 GB, defina o número de buckets como 1.000. Para tabelas muito grandes, você pode aumentar o tamanho do bucket para 2 GB a 3 GB.

acid.data.retain.hours

Não

O valor padrão é 24. O intervalo válido é [24, 168].

Especifica o intervalo de tempo, em horas, durante o qual você pode consultar estados históricos de dados usando Time Travel. Se precisar de um histórico de Time Travel superior a 168 horas (7 dias), entre em contato com o suporte técnico do MaxCompute.

  • Um valor de 0 indica que o estado histórico dos dados não é retido e consultas Time Travel não são suportadas.

  • Dados históricos anteriores ao valor especificado podem ser excluídos ou compactados.

  • Se uma consulta Time Travel especificar um horário anterior ao intervalo permitido definido por este parâmetro, um erro será retornado. Por exemplo, se este valor for 72, uma consulta por dados de mais de 72 horas atrás falhará.

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

Não

Valor padrão: false.

Se definido como true, o endTimestamp em uma consulta incremental pode ser posterior ao horário de commit de dados mais recente da tabela. Nesse caso, múltiplas consultas podem retornar resultados diferentes porque novos dados podem ter sido inseridos. Você pode modificar o valor deste parâmetro para uma tabela existente.

acid.write.precombine.field

Não

Especifica um único nome de coluna.

Se um nome de coluna for especificado, o sistema usa essa coluna em combinação com as colunas da chave primária para deduplicar dados dentro do mesmo commit. Isso garante a unicidade e consistência dos dados.

Nota

Se um único commit de dados exceder 128 MB, vários arquivos serão gerados. Este parâmetro não se aplica entre múltiplos arquivos.

acid.partial.fields.update.enable

Não

Se definido como true, você pode realizar uma atualização parcial de colunas na Delta Table usando SQL ou Tunnel.

Este parâmetro é definido quando você cria a tabela. Ele não pode ser modificado após a criação da tabela.

  • Outros requisitos de parâmetros para Delta Tables:

    • LIFECYCLE: O ciclo de vida da tabela deve ser maior ou igual ao período de retenção do time travel, ou seja, lifecycle >= acid.data.retain.hours / 24. Uma verificação é realizada quando a tabela é criada, e um erro é reportado se esta condição não for atendida.

    • Recursos não suportados: CLUSTERED BY, EXTERNAL e CREATE TABLE AS não são suportados.

  • Outras limitações:

    • Atualmente, outros engines não podem operar diretamente em uma Delta Table. Apenas MaxCompute SQL é suportado.

    • Não é possível converter uma tabela padrão em uma Delta Table.

    • Não é possível realizar alterações de esquema nas colunas de chave primária de uma Delta Table.

Parâmetros de Transactional Table

Parâmetro

Obrigatório

Descrição

TBLPROPERTIES("transactional"="true")

Sim

Define a tabela como uma Transactional Table, habilitando operações de update e delete no nível de linha. UPDATE | DELETE[Atualizar ou excluir dados (UPDATE

DELETE)](t2043562.dita#concept_2043562).

As seguintes limitações aplicam-se a uma Transactional Table:

  • Você pode definir a propriedade transactional apenas ao criar uma tabela. Não é possível usar ALTER TABLE para modificar essa propriedade em uma tabela existente. A seguinte instrução retorna um erro:

    ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true");
    -- Error returned.
    FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported
  • Não é possível definir uma tabela clusterizada ou uma tabela externa como Transactional Table.

  • Não é possível converter uma tabela interna padrão, tabela externa ou tabela clusterizada em uma Transactional Table, nem vice-versa.

  • Compactação automática não é suportada. Compacte arquivos manualmente conforme descrito em Compactar arquivos em uma Transactional Table.

  • A operação merge partition não é suportada.

  • O acesso a Transactional Tables a partir de outros sistemas é limitado. Por exemplo, o MaxCompute Graph não suporta operações de leitura ou escrita. Spark e PAI suportam apenas operações de leitura.

  • Antes de executar operações de update, delete ou insert overwrite em dados importantes, faça backup manual deles em outra tabela usando uma instrução SELECT ... INSERT.

Criar tabelas a partir de tabelas existentes

Criar tabela (a partir de existente)

  • Use a instrução CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; para criar outra tabela e copiar dados simultaneamente para a nova tabela.

    • Esta instrução não copia propriedades de partição. As colunas de partição da tabela de origem são tratadas como colunas regulares na tabela de destino. A propriedade de ciclo de vida da tabela de origem também não é copiada.

    • Use o parâmetro lifecycle para especificar um ciclo de vida para a nova tabela. Esta instrução também suporta a criação de uma tabela interna e a cópia de dados de uma tabela externa.

  • Use a instrução CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>; para criar uma nova tabela com o mesmo esquema de uma tabela existente.

    • Esta instrução copia o esquema, mas não copia dados nem a propriedade de ciclo de vida da tabela de origem.

    • Use o parâmetro lifecycle para especificar um ciclo de vida para a nova tabela. Esta instrução também suporta a criação de uma tabela interna que copia o esquema de uma tabela externa.

Exemplos

Tabela não particionada

  • Crie uma tabela não particionada.

    CREATE TABLE test1 (key STRING);
  • Crie uma tabela não particionada e especifique valores padrão para as colunas.

    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
    );

Tabela particionada

  • Crie uma tabela com particionamento padrão.

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
  • Crie uma tabela particionada AUTO PARTITION que gera partições com base em uma coluna de dados temporal usando uma função de tempo.

    -- 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);
  • Crie uma tabela particionada AUTO PARTITION que gera partições com base no tempo de ingestão de dados. O sistema recupera automaticamente o momento em que os dados são gravados no MaxCompute e gera partições usando uma função de tempo.

    -- 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');

Tabela com cluster hash ou por intervalo

  • Crie uma tabela não particionada com cluster hash.

    CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Crie uma tabela particionada com cluster hash.

    CREATE TABLE t2 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Crie uma tabela não particionada com cluster por intervalo.

    CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Crie uma tabela particionada com cluster por intervalo.

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

Tabela transacional

  • Crie uma tabela transacional não particionada.

    CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true");
  • Crie uma tabela transacional particionada.

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

Tabela interna

  • Crie uma tabela interna copiando dados de uma tabela externa particionada. A tabela interna não incluirá propriedades de partição.

    1. Crie uma tabela externa do OSS e uma tabela interna do MaxCompute. Crie uma tabela interna usando 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. Execute o comando DESC from_exetbl_oss; para visualizar o esquema da tabela interna. O comando retorna a seguinte saída.

      +------------------------------------------------------------------------------------+
      | 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     |       |                                             |
      +------------------------------------------------------------------------------------+
  • Crie uma tabela interna copiando o esquema de uma tabela externa particionada. A tabela interna inclui propriedades de partição.

    1. Crie a tabela interna from_exetbl_like. Consulte a tabela externa do OSS a partir do MaxCompute. Crie uma tabela interna usando 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. Execute o comando DESC from_exetbl_like; para visualizar o esquema da tabela interna. O comando retorna a seguinte saída.

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

Tabela Delta

  • Crie uma tabela Delta.

    CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
      TBLPROPERTIES ("transactional"="true");
  • Crie uma tabela Delta e defina propriedades chave da tabela.

    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;

Outros métodos

Substituir uma tabela existente

  1. Crie a tabela original my_table e insira dados nela.

    CREATE OR REPLACE TABLE my_table(a BIGINT);
    
    INSERT INTO my_table(a) VALUES (1),(2),(3);
  2. Use OR REPLACE para criar uma nova tabela com o mesmo nome e modificar suas colunas.

    CREATE OR REPLACE TABLE my_table(b STRING);
  3. Consulte a tabela my_table. A consulta retorna o seguinte resultado.

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

    As seguintes instruções SQL são invá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 dados e definir um 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;

Execute o comando DESC EXTENDED sale_detail_ctas1; para visualizar detalhes como o esquema e o ciclo de vida da tabela.

Nota

Neste exemplo, sale_detail é uma tabela particionada. Ao usar a instrução CREATE TABLE ... AS select_statement ... para criar a tabela sale_detail_ctas1, as propriedades de partição não são copiadas. As colunas de partição da tabela de origem tornam-se colunas regulares na tabela de destino. Portanto, sale_detail_ctas1 é uma tabela não particionada com cinco colunas.

Usar constantes para valores de coluna

Nota

Se você usar constantes como valores de coluna na cláusula SELECT, especifique nomes de colunas. Caso contrário, a quarta e a quinta colunas na tabela criada sale_detail_ctas3 receberão nomes padrão como _c4 e _c5.

  • Especifique nomes de colunas.

    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;
  • Não especifique nomes de colunas.

    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 um esquema e definir um ciclo de vida

CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;

Execute o comando DESC EXTENDED sale_detail_like; para visualizar detalhes como o esquema e o ciclo de vida da tabela.

Nota

O esquema de sale_detail_like é idêntico ao esquema de sale_detail. Todas as propriedades, como nomes de colunas, comentários de colunas e comentários de tabela, são copiadas, exceto a propriedade de ciclo de vida. No entanto, os dados em sale_detail não são copiados para a tabela sale_detail_like.

Copiar um esquema de uma tabela 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;

Execute o comando DESC mc_oss_extable_orc_like; para visualizar detalhes como o esquema da tabela.

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

Novos tipos de dados

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 a estrutura ou propriedades de uma tabela.

  • TRUNCATE TABLE: Remove todos os dados de uma tabela.

  • DROP TABLE: Exclua uma tabela.

  • DESC TABLE/VIEW: Visualize informações sobre uma tabela interna, view, materialized view, tabela externa, tabela clusterizada ou tabela transacional do MaxCompute.

  • SHOW: Visualize a instrução SQL DDL de uma tabela, todas as tabelas e views em um projeto ou todas as partições em uma tabela.