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 |
|
|
Sim |
Nome da tabela cujo proprietário será alterado. |
|
|
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 |
|
|
Sim |
Nome da tabela cujo comentário será alterado. |
|
|
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.
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 |
|
|
Sim |
Tabela a ser renomeada. |
|
|
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 |
|
|
Sim |
Nome da tabela cujo período de ciclo de vida será alterado. |
|
|
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 |
|
|
Sim |
Nome da tabela. |
|
|
Não |
Partição alvo. Formato: |
|
|
— |
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. |
|
|
— |
Impede que a tabela e todas as suas partições sejam recuperadas. Esta configuração tem prioridade sobre qualquer definição de |
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 |
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_datequantoregionsã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 |
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 |
|
new_pt_spec |
Sim |
Nova especificação da partição, no formato |
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 |
|
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_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;.Permissões: Este é um parâmetro no nível do projeto. Requer a função de proprietário do projeto, Super_Administrator ou Admin. Atribuir funções de gerenciamento integradas a um usuário.
Período de vigência: Entra em vigor aproximadamente 10 minutos após a definição.
-
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;.Permissões: Este é um parâmetro no nível do projeto. Requer a função de proprietário do projeto, Super_Administrator ou Admin. Atribuir funções de gerenciamento integradas a um usuário.
Período de vigência: Entra em vigor aproximadamente 10 minutos após a definição.
-
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;.Permissões: Este é um parâmetro no nível do projeto. Requer a função de proprietário do projeto, Super_Administrator ou Admin. Atribuir funções de gerenciamento integradas a um usuário.
Período de vigência: Entra em vigor aproximadamente 10 minutos após a definição.
-
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
NotaY 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;.Permissões: Este é um parâmetro no nível do projeto. Requer a função de proprietário do projeto, Super_Administrator ou Admin. Atribuir funções de gerenciamento integradas a um usuário.
Período de vigência: Entra em vigor aproximadamente 10 minutos após a definição.
-
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 propriedadeNullablee determinar se a coluna aceita valores NULL:Se
Nullablefortrue, valores NULL são permitidos.Se
Nullableforfalse, 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 deinsert overwritena 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.\