Todos os produtos
Search
Central de documentação

MaxCompute:ALTER TABLE

Última atualização: Jun 27, 2026

Modifica a estrutura, as propriedades ou as partições de uma tabela existente.

Observações de uso

Operações de evolução de schema (adição de colunas de tipos complexos, exclusão de colunas, reordenação de colunas ou alteração de tipos de dados) alteram o comportamento de leitura e escrita da tabela. Se você reordenar, adicionar e reordenar ou excluir uma coluna, os seguintes limites se aplicam:

  • Se o tipo de job for MapReduce 1.0, tarefas Graph não podem ler nem gravar na tabela modificada.

  • Para jobs CUPID, apenas as seguintes versões do Spark podem ler a tabela, mas não podem gravar nela:

    • Spark-2.3.0-odps0.34.0

    • Spark-3.1.1-odps0.34.0

  • Jobs do PAI podem ler a tabela, mas não podem gravar nela.

  • Em jobs do Hologres com versão anterior à 1,3, não é possível ler nem gravar na tabela modificada quando ela é referenciada como tabela externa.

  • Caso ocorra evolução de schema, o comando CLONE TABLE não é suportado.

  • Quando há evolução de schema, o Streaming Tunnel retorna um erro.

Alterar o proprietário da tabela

ALTER TABLE <table_name> changeowner TO <new_owner>;

Parâmetros:

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela cujo proprietário será alterado.

new_owner

Sim

Nome da conta do novo proprietário.

Exemplo:

-- Transfer ownership of the test1 table to ALIYUN$xxx@aliyun.com.
ALTER TABLE test1 changeowner TO 'ALIYUN$xxx@aliyun.com';

Alterar o comentário da tabela

ALTER TABLE <table_name> SET COMMENT '<new_comment>';

Parâmetros:

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela cujo comentário será alterado.

new_comment

Sim

Texto do novo comentário.

Exemplo:

ALTER TABLE sale_detail SET COMMENT 'new comments for table sale_detail';

Execute DESC <table_name> para verificar o comentário atualizado.

Atualizar o LastModifiedTime de uma tabela

A operação touch define o LastModifiedTime como o horário atual, reiniciando o cálculo do ciclo de vida da tabela.

ALTER TABLE <table_name> touch;

Exemplo:

ALTER TABLE sale_detail touch;

Alterar as propriedades de cluster de uma tabela

Adiciona ou remove propriedades de cluster em uma tabela particionada.

Importante

Propriedades de cluster só podem ser alteradas em tabelas particionadas. Tabelas não particionadas não permitem essa alteração após a criação. A mudança afeta apenas novas partições (incluindo aquelas criadas por INSERT OVERWRITE). Partições antigas mantêm suas propriedades originais. Como este comando afeta somente novas partições, não é possível especificar uma partição nesta instrução.

Sintaxe:

-- Add hash cluster properties.
ALTER TABLE <table_name> [clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC]
  [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];

-- Remove hash or range cluster properties from a table.
ALTER TABLE <table_name> NOT clustered;

-- Add range cluster properties (bucket count is optional; the system auto-determines the optimal count).
ALTER TABLE <table_name> [RANGE clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC]
  [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];

-- Remove range cluster properties from a partition or a table.
ALTER TABLE <table_name> NOT clustered;
ALTER TABLE <table_name> PARTITION [<pt_spec>] NOT clustered;

Os parâmetros são os mesmos descritos em CREATE TABLE.

Exemplo:

-- Create a partitioned table.
CREATE TABLE IF NOT EXISTS sale_detail(
  shop_name     STRING,
  customer_id   STRING,
  total_price   DOUBLE)
PARTITIONED BY (sale_date STRING, region STRING);

-- Add hash cluster properties. New partitions are stored with these settings.
ALTER TABLE sale_detail clustered BY (customer_id) sorted BY (customer_id) INTO 10 buckets;

Para mais detalhes sobre os tipos de clustering, consulte Hash Clustering e Range clustering.

Alterar as propriedades de uma PK Delta Table

-- Update the bucket count for a partitioned PK Delta Table.
ALTER TABLE <table_name> SET tblproperties("write.bucket.num"="64");

-- Update the bucket count for a non-partitioned PK Delta Table.-- Existing data is redistributed based on the new bucket count.
ALTER TABLE <table_name> REWRITE tblproperties("write.bucket.num"="128");

-- Update the retain property: the time range (in hours) for Time Travel queries.
ALTER TABLE <table_name> SET tblproperties("acid.data.retain.hours"="60");

Renomear uma tabela

Renomeia uma tabela sem modificar seus dados.

ALTER TABLE <table_name> RENAME TO <new_table_name>;

Parâmetros:

Parâmetro

Obrigatório

Descrição

table_name

Sim

Tabela a ser renomeada.

new_table_name

Sim

Novo nome. Um erro será retornado se já existir uma tabela com esse nome.

Exemplo:

ALTER TABLE sale_detail RENAME TO sale_detail_rename;

Modificar o período do ciclo de vida

Altera o período do ciclo de vida de uma tabela particionada ou não particionada existente.

ALTER TABLE <table_name> SET LIFECYCLE <days>;

Parâmetros:

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela cujo período de ciclo de vida será alterado.

days

Sim

Novo período do ciclo de vida, em dias. Deve ser um número inteiro positivo.

Exemplo:

-- Modify the lifecycle of sale_detail_rename to 50 days.
ALTER TABLE sale_detail_rename SET LIFECYCLE 50;

Ativar ou desativar o ciclo de vida

Ativa ou desativa o ciclo de vida de uma tabela ou de uma partição específica.

ALTER TABLE <table_name> PARTITION [<pt_spec>] {enable|disable} LIFECYCLE;

Parâmetros:

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela.

pt_spec

Não

Partição alvo. Formato: partition_col1=val1, partition_col2=val2, .... Para tabelas com múltiplos níveis de partição, especifique todos os valores de partição.

enable

Reaplica a recuperação do ciclo de vida na tabela e em suas partições usando as configurações atuais. Atualize as configurações de ciclo de vida antes de ativar, se necessário, para evitar recuperação indesejada de dados.

disable

Impede que a tabela e todas as suas partições sejam recuperadas. Esta configuração tem prioridade sobre qualquer definição de enable no nível da partição. As configurações de ciclo de vida e os sinalizadores no nível da partição são preservados e ainda podem ser modificados enquanto o ciclo de vida estiver desativado.

Exemplos:

-- Example 1: Disable the lifecycle for the sale_detail_rename table.
ALTER TABLE sale_detail_rename disable LIFECYCLE;

-- Example 2: Add test partitions.
ALTER TABLE sale_detail_rename ADD IF NOT EXISTSPARTITION (sale_date='201910', region='shanghai') PARTITION (sale_date='201911', region='shanghai')
  PARTITION (sale_date='201912', region='shanghai') PARTITION (sale_date='202001', region='shanghai')
  PARTITION (sale_date='202002', region='shanghai') PARTITION (sale_date='201910', region='beijing')
  PARTITION (sale_date='201911', region='beijing') PARTITION (sale_date='201912', region='beijing')
  PARTITION (sale_date='202001', region='beijing') PARTITION (sale_date='202002', region='beijing');

-- Disable the lifecycle for a single partition.
ALTER TABLE sale_detail_rename PARTITION (sale_date='201912', region='shanghai') disable LIFECYCLE;

Adicionar uma partição

Adicione uma ou mais partições a uma tabela particionada existente.

Observações de uso

  • Em tabelas com múltiplos níveis de partição, especifique valores para todas as colunas-chave de partição ao adicionar uma nova partição.

  • Esta operação adiciona apenas valores de partição, não colunas-chave de partição.

Sintaxe

ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...];

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela particionada.

IF NOT EXISTS

Não

Suprime o erro caso a partição já exista.

pt_spec

Sim

Partição a ser adicionada, no formato (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...). partition_col é uma coluna-chave de partição e partition_col_value é seu valor. Nomes de colunas-chave de partição não diferenciam maiúsculas de minúsculas. Valores de partição diferenciam maiúsculas de minúsculas.

Exemplos

Os exemplos abaixo utilizam uma tabela particionada chamada sale_detail. Para criar esta tabela, consulte Criar e excluir tabelas.

CREATE TABLE IF NOT EXISTS sale_detail(
  shop_name     STRING,
  customer_id   STRING,
  total_price   DOUBLE)
PARTITIONED BY (sale_date STRING, region STRING);
  • Adicionar uma única partição

    Adicione uma partição para a região de Hangzhou em dezembro de 2025.

    ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='hangzhou');
  • Adicionar várias partições simultaneamente

    Adicione duas partições para as regiões de Pequim e Xangai em dezembro de 2025.

    ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='beijing') PARTITION (sale_date='202512', region='shanghai');
  • Especificação incompleta de partição (erro)

    Especificar apenas parte de uma chave de partição multinível retorna um erro. Tanto sale_date quanto region são obrigatórios.

    ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20260111');
    
    -- Error returned:
    -- FAILED: ODPS-0130071:[1,58] Semantic analysis exception - provided partition spec does not match table partition spec
  • Adicionar uma partição a uma Delta Table

    -- Create a Delta Table.
    CREATE TABLE delta_table_test_par (
      pk BIGINT NOT NULL PRIMARY KEY,
      val BIGINT NOT NULL)
      PARTITIONED BY (dd STRING, hh STRING)
      TBLPROPERTIES ("transactional"="true");
    
    -- Add a partition.
    ALTER TABLE delta_table_test_par ADD PARTITION (dd='01', hh='01');
    
    CREATE TABLE delta_table_test_nonpar (
      pk BIGINT NOT NULL PRIMARY KEY,
      val BIGINT NOT NULL)
      TBLPROPERTIES ("transactional"="true");
  • Modificar propriedades de uma PK Delta Table

    -- Update the number of buckets for a partitioned PK Delta Table.
    ALTER TABLE delta_table_test_par SET TBLPROPERTIES("write.bucket.num"="64");
    
    -- Update the number of buckets for a non-partitioned PK Delta Table.
    -- After the update, historical data is redistributed based on the new bucket count.
    ALTER TABLE delta_table_test_nonpar REWRITE TBLPROPERTIES("write.bucket.num"="128");
    
    -- Update the retain property. This property specifies the number of hours
    -- for querying historical data states via Time Travel.
    ALTER TABLE delta_table_test_par SET TBLPROPERTIES("acid.data.retain.hours"="60");

Após adicionar partições, verifique-as com SHOW PARTITIONS. Consulte Listar todas as partições.

Modificar o horário de atualização da partição

A operação touch redefine o LastModifiedTime de uma partição para o horário atual, acionando o recálculo do ciclo de vida.

Observações de uso

Para tabelas com múltiplos níveis de partição, especifique valores para todas as colunas-chave de partição.

Sintaxe

ALTER TABLE <table_name> TOUCH PARTITION (<pt_spec>);

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela particionada. Retorna um erro se a tabela não existir.

pt_spec

Sim

Partição a ser atualizada, no formato (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...). partition_col é uma coluna-chave de partição e partition_col_value é seu valor. Retorna um erro se a partição não existir.

Exemplos

-- Update the LastModifiedTime of a specific partition in the sale_detail table.
ALTER TABLE sale_detail TOUCH PARTITION (sale_date='202512', region='shanghai');

Modificar um valor de partição

O comando RENAME altera os valores de uma partição existente.

Observações de uso

  • Esta operação altera apenas valores de partição, não renomeia colunas-chave de partição.

  • Em tabelas com múltiplos níveis de partição, especifique valores para todas as colunas-chave de partição.

Sintaxe

ALTER TABLE <table_name> PARTITION (<pt_spec>) RENAME TO PARTITION (<new_pt_spec>);

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela particionada.

pt_spec

Sim

Especificação atual da partição, no formato (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...). partition_col é uma coluna-chave de partição e partition_col_value é seu valor. Retorna um erro se a partição não existir.

new_pt_spec

Sim

Nova especificação da partição, no formato (partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, ...). partition_col é uma coluna-chave de partição e new_partition_col_value é o novo valor.

Exemplos

-- Rename a partition in the sale_detail table.
ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') RENAME TO PARTITION (sale_date = '201310', region = 'beijing');

Mesclar partições

O comando MERGE PARTITION combina várias partições em uma única partição de destino. Os dados são movidos para o destino e as partições de origem são excluídas.

Observações de uso

  • Tabelas externas não são suportadas.

  • Mesclar partições de uma tabela clusterizada remove o clustering da partição resultante.

  • É possível mesclar no máximo 4.000 partições por vez.

Sintaxe

ALTER TABLE <table_name> MERGE [IF EXISTS] PARTITION (<predicate>) [, PARTITION(<predicate2>) ...] OVERWRITE PARTITION (<fullpartitionSpec>) [PURGE];

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela particionada.

IF EXISTS

Não

Suprime o erro se nenhuma partição corresponder à condição. Caso nenhuma partição seja qualificada, nenhuma nova partição será criada. Operações concorrentes de INSERT, RENAME ou DROP durante a mesclagem ainda causam erro.

predicate

Sim

Condição que as partições de origem devem atender.

fullpartitionSpec

Sim

Especificação da partição de destino.

PURGE

Não

Limpa o diretório de sessão. Por padrão, logs dos últimos três dias são removidos. Para mais informações, consulte Purge.

Exemplos

Mesclar partições por condição

-- View current partitions.
SHOW PARTITIONS sale_detail;

-- Sample result:
-- sale_date=202512/region=beijing
-- sale_date=202512/region=shanghai
-- sale_date=202602/region=beijing

-- Merge all partitions where sale_date='202512' into a single destination partition.
ALTER TABLE sale_detail MERGE PARTITION(sale_date='202512') OVERWRITE PARTITION(sale_date='202601', region='hangzhou');

-- View partitions after the merge.
SHOW PARTITIONS sale_detail;

-- Sample result:
-- sale_date=202601/region=hangzhou
-- sale_date=202602/region=beijing

Mesclar partições específicas com PURGE

-- Merge two named partitions into a new destination partition.
ALTER TABLE sale_detail MERGE IF EXISTS
  PARTITION(sale_date='202601', region='hangzhou'),
  PARTITION(sale_date='202602', region='beijing')
  OVERWRITE PARTITION(sale_date='202603', region='shanghai') PURGE;

-- View partitions after the merge.
SHOW PARTITIONS sale_detail;

-- Sample result:
-- sale_date=202603/region=shanghai

Excluir uma partição

Remova uma ou mais partições de uma tabela. É possível excluir partições específicas pelo nome ou usar condições de filtro para exclusão em massa.

Excluir partições reduz o uso de armazenamento. Para automatizar a exclusão de partições antigas, utilize o recurso de Ciclo de vida.

Observações de uso

  • Cada cláusula de filtro de partição pode referenciar apenas uma coluna-chave de partição.

  • Funções usadas em expressões de filtro devem ser funções escalares integradas.

Sintaxe

Excluir partições específicas

-- Delete one partition.
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>;

-- Delete multiple partitions.
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>,PARTITION <pt_spec>[,PARTITION <pt_spec>....];

Excluir partições por condição de filtro

ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <partition_filtercondition>;

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela particionada.

IF EXISTS

Não

Suprime o erro caso a partição não exista.

pt_spec

Sim

Partição a ser excluída, no formato (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...). partition_col é uma coluna-chave de partição e partition_col_value é seu valor. Nomes de colunas-chave de partição não diferenciam maiúsculas de minúsculas. Valores de partição diferenciam maiúsculas de minúsculas.

partition_filtercondition

Não

Obrigatório ao usar exclusão baseada em filtro. Consulte Sintaxe de condição de filtro de partição.

Sintaxe de condição de filtro de partição

As operações de exclusão e truncamento suportam a mesma sintaxe de filtro de partição:

partition_filtercondition
    : PARTITION (<partition_col> <relational_operators> <partition_col_value>)
    | PARTITION (scalar(<partition_col>) <relational_operators> <partition_col_value>)
    | PARTITION (<partition_filtercondition1> AND|OR <partition_filtercondition2>)
    | PARTITION (NOT <partition_filtercondition>)
    | PARTITION (<partition_filtercondition1>)[,PARTITION (<partition_filtercondition2>), ...]

Elemento

Descrição

partition_col

Nome da coluna-chave de partição.

relational_operators

Operador relacional. Para detalhes, consulte Operadores.

partition_col_value

Valor ou expressão regular para comparação com o valor da coluna-chave de partição. O tipo de dados deve corresponder ao tipo da coluna-chave de partição.

scalar()

Função escalar integrada. Processa o valor da coluna-chave de partição antes da comparação.

NOT, AND, OR

Operadores lógicos suportados dentro de uma única cláusula de filtro.

Cláusulas separadas por vírgula

Múltiplas cláusulas de filtro separadas por vírgulas são combinadas com o operador OR.

Exemplos

Excluir partições específicas

-- Delete one partition.
ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202603',region='shanghai');

-- Delete two partitions at once.
ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202412',region='hangzhou'),PARTITION(sale_date='202412',region='shanghai');

Excluir partições por condição de filtro (tabela de nível único)

-- Create a single-level partitioned table with sample partitions.
CREATE TABLE IF NOT EXISTS sale_detail_del(
shop_name     STRING,
customer_id   STRING,
total_price   DOUBLE)
PARTITIONED BY (sale_date STRING);

-- Add partitions.
ALTER TABLE sale_detail_del ADD IF NOT EXISTS
PARTITION (sale_date= '201910') PARTITION (sale_date= '201911') PARTITION (sale_date= '201912')
PARTITION (sale_date= '202001') PARTITION (sale_date= '202002') PARTITION (sale_date= '202003')
PARTITION (sale_date= '202004') PARTITION (sale_date= '202005') PARTITION (sale_date= '202006')
PARTITION (sale_date= '202007');

-- Delete by comparison.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911');
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date >= '202007');

-- Delete by pattern matching.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date LIKE '20191%');

-- Delete by value list.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date IN ('202002','202004','202006'));

-- Delete by range.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date BETWEEN '202001' AND '202007');

-- Delete using a scalar function.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(substr(sale_date, 1, 4) = '2020');

-- Delete with OR condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201912' OR sale_date >= '202006');

-- Delete with AND condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date > '201912' AND sale_date <= '202004');

-- Delete with NOT condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(NOT sale_date > '202004');

-- Multiple filter clauses separated by commas are combined with OR.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007');

-- Delete by regular expression.
ALTER TABLE sale_detail_del ADD IF NOT EXISTS
PARTITION (sale_date= '2019-10-05')
PARTITION (sale_date= '2019-10-06')
PARTITION (sale_date= '2019-10-07');

ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+');

Excluir partições de uma tabela com múltiplos níveis de partição

-- Create a multi-level partitioned table with sample partitions.
CREATE TABLE IF NOT EXISTS region_sale_detail(
shop_name     STRING,
customer_id   STRING,
total_price   DOUBLE)
PARTITIONED BY (sale_date STRING , region STRING );

-- Add partitions.
ALTER TABLE region_sale_detail ADD IF NOT EXISTS
PARTITION (sale_date= '201910',region = 'shanghai') PARTITION (sale_date= '201911',region = 'shanghai')
PARTITION (sale_date= '201912',region = 'shanghai') PARTITION (sale_date= '202001',region = 'shanghai')
PARTITION (sale_date= '202002',region = 'shanghai') PARTITION (sale_date= '201910',region = 'beijing')
PARTITION (sale_date= '201911',region = 'beijing') PARTITION (sale_date= '201912',region = 'beijing')
PARTITION (sale_date= '202001',region = 'beijing') PARTITION (sale_date= '202002',region = 'beijing');

-- Comma-separated filter clauses are combined with OR.
-- This deletes all partitions where sale_date < '201911' OR region = 'beijing'.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'),PARTITION(region = 'beijing');

-- To combine conditions with AND, place both conditions in a single clause.
-- This deletes only partitions where sale_date < '201911' AND region = 'beijing'.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911', region = 'beijing');
Cada cláusula de filtro pode referenciar apenas uma coluna-chave de partição. Usar AND para combinar várias colunas-chave de partição em uma única cláusula de filtro retorna um erro.
-- The following statement fails because it references two partition key columns
-- (sale_date and region) with AND in a single filter clause.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911' AND region = 'beijing');

-- Error returned:
-- FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region,
-- partition expression must have one and only one column reference

Adicionar colunas ou comentários

Adicione colunas ou comentários a uma tabela particionada ou não particionada. Revise o escopo da evolução de schema. Tipos complexos como STRUCT<x: STRING, y: BIGINT> e MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>> são suportados.

  • Configurações de parâmetros

    Para ativar este recurso, defina o parâmetro setproject odps.schema.evolution.enable=true;.

  • Formato do comando

    ALTER TABLE <table_name> 
      ADD COLUMNS [IF NOT EXISTS]
      (<col_name1> <type1> COMMENT ['<col_comment>']
      [, <col_name2> <type2> COMMENT '<col_comment>'...]
      );
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo. Novas colunas são anexadas ao final da tabela; não é possível especificar sua ordem.

    col_name

    Sim

    Nome da nova coluna.

    type

    Sim

    Tipo de dados da nova coluna.

    col_comment

    Não

    Comentário da nova coluna.

  • Exemplos

    • Exemplo 1: Adicionar duas colunas à tabela sale_detail.

      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);
    • Exemplo 2: Adicionar duas colunas com comentários à tabela sale_detail.

      ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' );
    • Exemplo 3: Adicionar uma coluna de tipo de dados complexo à tabela sale_detail.

      ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);
    • Exemplo 4: Se a coluna já existir, IF NOT EXISTS garante que a instrução seja bem-sucedida sem duplicar a coluna.

      -- The statement is successful, but the ID column is not repeatedly added.
      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);
    • Exemplo 5: Adicionar uma coluna a uma Delta Table.

      CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
        TBLPROPERTIES ("transactional"="true");
      ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);

Excluir colunas

Exclua uma ou mais colunas de uma tabela particionada ou não particionada. Revise o escopo da evolução de schema.

  • Configurações de parâmetros

    Para ativar este recurso, defina o parâmetro setproject odps.schema.evolution.enable=true;.

  • Formato do comando

    -- Delete one or more columns.
    ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...];
  • Parâmetros

    • table_name: Obrigatório. Nome da tabela da qual as colunas serão excluídas.

    • col_name: Obrigatório. Nome da coluna a ser excluída.

  • Exemplo

    -- Example 1: Delete the customer_id column from the sale_detail table.
    ALTER TABLE sale_detail DROP COLUMNS customer_id;
    -- Example 2: Delete the shop_name and total_price columns from the sale_detail table.
    ALTER TABLE sale_detail DROP COLUMNS shop_name, total_price;

Alterar tipos de dados de colunas

Altere o tipo de dados de uma coluna. Revise o escopo da evolução de schema.

  • Configurações de parâmetros

    Para ativar este recurso, defina o parâmetro setproject odps.schema.evolution.enable=true;.

  • Formato do comando

    ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>;
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    old_column_name

    Sim

    Coluna a ser alterada.

    new_column_name

    Sim

    Nome da coluna após a alteração de tipo.

    old_column_name e new_column_name podem ser iguais (sem renomeação). No entanto, new_column_name não deve coincidir com nenhum outro nome de coluna existente, exceto old_column_name.

    new_data_type

    Sim

    Novo tipo de dados da coluna.

  • Exemplo

    -- Change the data type of the id field in the sale_detail table from BIGINT to STRING.
    ALTER TABLE sale_detail CHANGE COLUMN id id STRING;
  • Tabela de conversão de tipos de dados

    Nota

    Y indica que a conversão é suportada. N indica que a conversão não é suportada. - indica que a conversão não se aplica. Y() indica que a conversão é suportada se a condição entre parênteses for atendida.

    数据类型支持转换表

Alterar a ordem das colunas

Altere a ordem das colunas em uma tabela particionada ou não particionada. Revise o escopo da evolução de schema.

  • Configurações de parâmetros

    Para ativar este recurso, defina o parâmetro setproject odps.schema.evolution.enable=true;.

  • Formato do comando

    ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>;
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    old_column_name

    Sim

    Coluna a ser reordenada.

    new_col_name

    Sim

    Novo nome da coluna.

    new_col_name e old_column_name podem ser iguais (sem renomeação). No entanto, new_col_name não deve coincidir com nenhum outro nome de coluna existente, exceto old_column_name.

    column_type

    Sim

    Tipo de dados atual da coluna. Não pode ser alterado por este comando.

    column_name

    Sim

    Posiciona a coluna imediatamente após column_name.

  • Exemplo

    -- Change the name of the customer column in the sale_detail table to customer_id and move it after the total_price column.
    ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price;
    -- Move the customer_id column in the sale_detail table after the total_price column without changing the column name.
    ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;

Alterar o nome de uma coluna

Renomeie uma coluna em uma tabela particionada ou não particionada.

  • Formato do comando

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>;
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    old_col_name

    Sim

    Nome atual da coluna. Deve existir na tabela.

    new_col_name

    Sim

    Novo nome da coluna. Deve ser único dentro da tabela.

  • Exemplo

    -- Rename the customer_name column in the sale_detail table to customer.
    ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;

Alterar o comentário de uma coluna

Altere o comentário de uma coluna em uma tabela particionada ou não particionada.

  • Sintaxe

    ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>';
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    col_name

    Sim

    Coluna cujo comentário será alterado. Deve existir na tabela.

    col_comment

    Sim

    Novo comentário. Máximo de 1024 bytes.

  • Exemplo

    -- Change the comment of the customer column in the sale_detail0113 table.
    ALTER TABLE sale_detail0113 CHANGE COLUMN customer COMMENT 'customer';

Alterar o nome e o comentário de uma coluna

Altere o nome e o comentário de uma coluna em uma tabela particionada ou não particionada.

  • Formato do comando

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>';
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    old_col_name

    Sim

    Coluna a ser modificada. Deve existir na tabela.

    new_col_name

    Sim

    Novo nome da coluna. Deve ser único dentro da tabela.

    column_type

    Sim

    Tipo de dados da coluna.

    col_comment

    Opcional

    Novo comentário. Máximo de 1024 bytes.

  • Exemplo

    -- Change the name of the customer column in the sale_detail table to customer_newname and change its comment to 'customer'.
    ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';

Alterar a propriedade NOT NULL de uma coluna

Altere a restrição NOT NULL de uma coluna que não seja chave de partição para permitir valores NULL.

Essa alteração é irreversível. Depois que uma coluna passa a aceitar valores NULL, não é possível revertê-la para NOT NULL.

  • Execute o comando DESC EXTENDED table_name; para visualizar o valor da propriedade Nullable e determinar se a coluna aceita valores NULL:

    • Se Nullable for true, valores NULL são permitidos.

    • Se Nullable for false, valores NULL não são permitidos.

  • Formato do comando

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;
  • Parâmetros

    Parâmetro

    Obrigatório

    Descrição

    table_name

    Sim

    Nome da tabela alvo.

    old_col_name

    Sim

    Coluna que não seja chave de partição a ser modificada. Deve ser uma coluna existente que não seja chave de partição.

  • Exemplo

    -- Create a partitioned table where the id column does not allow NULL values.
    CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string);
    -- View the table properties.
    DESC EXTENDED null_test;
    -- The following result is returned:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | false    | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+
    -- Change the id column to allow NULL values.
    ALTER TABLE null_test CHANGE COLUMN id NULL;
    -- View the table properties.
    DESC EXTENDED null_test;
    -- The following result is returned:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | true     | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+

Compactar arquivos de tabela transacional

O armazenamento físico subjacente de uma tabela transacional consiste em arquivos base e arquivos delta que não podem ser lidos diretamente. Quando operações de update ou delete são executadas em uma tabela transacional, apenas arquivos delta são anexados. Os arquivos base não são modificados. Consequentemente, mais atualizações ou exclusões levam a maior consumo de armazenamento e custos de consulta mais elevados.

Executar múltiplas operações de update ou delete na mesma tabela ou partição gera um grande número de arquivos delta. Ao ler dados, o sistema carrega esses arquivos delta para determinar quais linhas foram atualizadas ou excluídas. Uma grande quantidade de arquivos delta degrada o desempenho de leitura de dados. Nesse caso, compacte os arquivos base e delta para reduzir o armazenamento e melhorar o desempenho de leitura.

  • Sintaxe

    ALTER TABLE <table_name> [PARTITION (<partition_key> = '<partition_value>' [, ...])] compact {minor|major};
  • Parâmetros

    • table_name: Obrigatório. Nome da tabela transacional cujos arquivos serão compactados.

    • partition_key: Opcional. Nome da coluna de partição, caso a tabela transacional seja particionada.

    • partition_value: Opcional. Valor da coluna de partição, caso a tabela transacional seja particionada.

    • major|minor: Especifique pelo menos um. As diferenças são as seguintes:

      • minor: Mescla os arquivos base e todos os arquivos delta associados para eliminar os arquivos delta.

      • major: Além de mesclar os arquivos base e todos os arquivos delta associados para eliminar os arquivos delta, também mescla pequenos arquivos entre os arquivos base da tabela. Quando os arquivos base são pequenos (menos de 32 MB) ou existem arquivos delta, isso equivale a executar uma operação de insert overwrite na tabela. No entanto, quando os arquivos base são suficientemente grandes (32 MB ou mais) e não existem arquivos delta, nenhuma regravação ocorre.

  • Exemplos

    • Exemplo 1: Compactar arquivos da tabela transacional acid_delete.

      ALTER TABLE acid_delete compact minor;

      Saída de exemplo:

      Summary:
      Nothing found to merge, set odps.merge.cross.paths=true IF cross path merge is permitted.
      OK
    • Exemplo 2: Compactar arquivos da tabela transacional acid_update_pt.

      ALTER TABLE acid_update_pt PARTITION (ds = '2019') compact major;

      Saída de exemplo:

      Summary:
      table name: acid_update_pt /ds=2019  instance count: 2  run time: 6
        before merge, file count:        8  file size: 2613  file physical size: 7839
         after merge, file count:        2  file size: 679  file physical size: 2037
      
      OK

Mesclar pequenos arquivos

Um sistema de arquivos distribuído armazena dados em blocos. Arquivos menores que o tamanho do bloco (64 MB) são chamados de pequenos arquivos. Sistemas distribuídos inevitavelmente produzem pequenos arquivos, como resultados de computação SQL ou de outros mecanismos distribuídos e saídas de ingestão de dados via Tunnel. Mesclar pequenos arquivos pode melhorar o desempenho de computação.

Sintaxe

ALTER TABLE <tablename> [PARTITION(<partition_key>=<partition_value>)] MERGE SMALLFILES;
  • Parâmetros

    • table_name: Obrigatório. Nome da tabela cujos arquivos serão mesclados.

    • partition_key: Opcional. Nome da coluna de partição, caso a tabela seja particionada.

    • partition_value: Opcional. Valor da coluna de partição, caso a tabela seja particionada.

  • Exemplos

    SET odps.merge.cross.paths=true;
    SET odps.merge.smallfile.filesize.threshold=128;
    SET odps.merge.max.filenumber.per.instance = 2000;
    ALTER TABLE tbcdm.dwd_tb_log_pv_di PARTITION (ds='20151116') MERGE smallfiles;

O recurso de mesclagem de pequenos arquivos requer recursos de computação. Para instâncias de pagamento conforme o uso, esta operação incorre em taxas. As regras de faturamento são as mesmas do faturamento de SQL sob demanda. Para mais informações, consulte Preços de computação (pagamento conforme o uso).

Para mais informações, consulte Mesclar pequenos arquivos.

Instruções relacionadas

  • CREATE TABLE: Cria uma tabela não particionada, tabela particionada, tabela externa ou tabela clusterizada.

  • TRUNCATE TABLE: Trunca os dados em uma tabela especificada.

  • DROP TABLE: Exclui uma tabela particionada ou não particionada.

  • DESC TABLE/VIEW: Visualiza informações sobre tabelas internas do MaxCompute, views, views materializadas, tabelas externas, tabelas clusterizadas ou tabelas transacionais.

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