Todos os produtos
Search
Central de documentação

MaxCompute:Criar e excluir tabelas

Última atualização: Jun 27, 2026

Crie e exclua tabelas não particionadas, particionadas, externas, clusterizadas, transacionais e Delta no MaxCompute.

Tipo

Descrição

Permissão necessária

Ferramentas de execução

CREATE TABLE

Cria uma tabela não particionada, particionada, externa ou clusterizada.

Requer a permissão CreateTable no projeto.

Execute estes comandos em:

DROP TABLE

Exclui uma tabela particionada ou não particionada.

Requer a permissão Drop na tabela.

Criar uma tabela

Crie tabelas não particionadas, particionadas, externas ou clusterizadas.

Limitações

  • Uma tabela particionada pode ter até seis níveis de partição. Por exemplo, use uma data como coluna de partição e defina níveis como year/month/week/day/hour/minute.

  • O número máximo de partições por tabela é configurável por projeto, com padrão de 60.000.

Limitações adicionais de tabelas estão documentadas em Limites do MaxCompute SQL.

Sintaxe

Tabela interna

Criar 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

Criar 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

Criar uma tabela externa

Este exemplo cria uma tabela externa 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 distribuirá 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 usará 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. Especifique-a durante a 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 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 tabelas em projetos Lakehouse externos.

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

Parâmetros

Parâmetros gerais

Parâmetros gerais

Parâmetro

Obrigatório

Descrição

Observações

OR REPLACE

Não

  • Se existir uma tabela com o mesmo nome, ela será excluída 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, criar uma tabela com nome duplicado retorna um erro. Com IF NOT EXISTS, a instrução tem êxito mesmo que exista uma tabela com o mesmo nome e esquema diferente. Os metadados da tabela existente permanecem inalterados.

table_name

Sim

Nome da tabela.

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

PRIMARY KEY(pk)

Não

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

Nome da coluna.

  • O nome da coluna deve ter 128 bytes ou menos e conter apenas letras, dígitos, sublinhados (_) 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

Comentário da coluna.

Deve ser uma string de 1.024 bytes ou menos.

data_type

Sim

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 obter mais informações sobre como modificar a propriedade NOT NULL, consulte Operações de partição.

default_value

Nã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

Comentário da tabela.

Deve ser uma string de 1.024 bytes ou menos.

LIFECYCLE

Nã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. Ao contrário 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 só pode ser definido no nível da tabela, não no nível da partição.

Parâmetros de tabela particionada

Parâmetros de tabela particionada

O MaxCompute suporta tabelas particionadas padrão e com partição automática. Escolha com base em como as colunas de partição são geradas. Visão geral de tabelas particionadas.

Parâmetros de tabela particionada padrão

Parâmetro

Obrigatório

Descrição

Observações

PARTITIONED BY

Sim

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

É possível especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos.

col_name

Sim

Nome da coluna de partição.

  • O nome da coluna deve ter 128 bytes ou menos e conter apenas letras, dígitos, sublinhados (_) 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

Tipo de dados da coluna de partição.

O MaxCompute V1.0 suporta apenas STRING. A 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

Comentário da coluna de partição.

Deve ser uma string de 1.024 bytes ou menos.

Nota

Um valor de partição deve ter 255 bytes ou menos. 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 (:), sublinhado (_), 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 partição automática

Uma tabela com partição automática 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 partição automática.

É possível especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos.

auto_partition_expression

Sim

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

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 partição automática baseadas no tempo de ingestão de dados.

Parâmetros de tabela clusterizada

Parâmetros de tabela clusterizada

As tabelas clusterizadas são categorizadas em tabelas com cluster hash e tabelas com cluster de 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 distorção de dados e obter bom paralelismo, escolha colunas com alta cardinalidade e poucas 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. Execute 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 de 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. Também é possível executar o comando set odps.stage.reducer.num=<concurrency>; para exceder o limite de 1.111 buckets hash.

  • Para otimizar operações de join, remover as etapas de shuffle e classificação 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 classificação, melhorando a eficiência da execução.

Tabela com cluster de intervalo

Parâmetro

Obrigatório

Descrição

Observações

RANGE CLUSTERED BY

Sim

Especifica as colunas de cluster de 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 de intervalo, a prática recomendada de potência de 2 (2n) que se aplica 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 de 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 de intervalo, se a chave de junção ou chave de grupo for a chave de cluster de intervalo ou seu prefixo, é possível eliminar a redistribuição de dados (remoção de shuffle) para melhorar o desempenho. Execute 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:

    • Poda de buckets otimizada

    • Agregações otimizadas

    • Armazenamento otimizado

  • Limitações das tabelas clusterizadas:

    • INSERT INTO não é suportado. Adicione dados apenas usando INSERT OVERWRITE.

    • O upload direto de dados para uma tabela com cluster de 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.

Parâmetros de tabela externa

Parâmetros de tabela externa

Esta seção aborda os parâmetros de tabelas externas 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, compactação e análise de caracteres para a tabela externa.

oss_location

Sim

Local de armazenamento OSS dos dados da tabela externa. Para obter mais informações, consulte Tabelas externas OSS.

Parâmetros de Transactional Table e Delta Table

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 a sintaxe padrão de chave primária SQL. 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. Defina 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. Modifique este parâmetro para uma tabela particionada, e a nova configuração entrará 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 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 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, aumente 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 é possível 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 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. Modifique 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 usará esta 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 a múltiplos arquivos.

acid.partial.fields.update.enable

Não

Se definido como true, é possível realizar uma atualização parcial de coluna na Delta Table usando SQL ou Tunnel.

Este parâmetro é definido ao criar 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 ao criar a tabela, e um erro é relatado se essa 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 mecanismos 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:

  • Defina a propriedade transactional apenas ao criar uma tabela. Não use ALTER TABLE para modificar esta 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, ou 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 gravação. 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 tabela (a partir de existente)

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 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 particionada 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 horário 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 de 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 de 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 de 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 OSS e uma tabela interna 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 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 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;

DROP TABLE

Exclui uma tabela não particionada ou uma tabela particionada.

Precauções

  • Tenha cuidado ao excluir uma tabela. Uma tabela excluída só pode ser restaurada se o backup e a restauração estiverem ativados para o projeto e a tabela estiver dentro do período de retenção de dados. A restauração requer que o backup local esteja configurado.

  • Excluir uma tabela reduz o uso de armazenamento do projeto MaxCompute.

Sintaxe

DROP TABLE [IF EXISTS] <table_name>; 

Parâmetros

Parâmetro

Obrigatório

Descrição

IF EXISTS

Não

Sem IF EXISTS, tentar excluir uma tabela inexistente retorna uma exceção. Com IF EXISTS, a instrução tem êxito mesmo que a tabela não exista.

table_name

Sim

Nome da tabela a ser excluída.

Exemplos

-- Drop the sale_detail table. The statement succeeds regardless of whether the table exists.
DROP TABLE IF EXISTS sale_detail; 

Referências