Todos os produtos
Search
Central de documentação

MaxCompute:Perguntas frequentes sobre operações DML

Última atualização: Aug 21, 2026

Este tópico responde a perguntas frequentes (FAQs) sobre a execução de operações de Linguagem de Manipulação de Dados (DML) em tabelas.

Categoria

Pergunta frequente

Inserir ou atualizar dados

Excluir dados

Os dados originais são corrompidos se ocorrer um erro durante uma operação INSERT?

Não. O MaxCompute garante atomicidade: se a operação INSERT for bem-sucedida, os dados serão atualizados; caso falhe, o sistema reverte os dados.

O que fazer se o erro Table xxx has n columns, but query has m columns for relatado ao executar uma instrução INSERT INTO ou INSERT OVERWRITE?

Ao inserir dados com uma instrução INSERT INTO ou INSERT OVERWRITE, garanta que os campos na cláusula SELECT correspondam aos campos da tabela de destino em quantidade, ordem e tipo de dados. O MaxCompute não oferece suporte à inserção de dados em campos específicos enquanto outros recebem valores NULL ou padrão. Para contornar isso, defina os valores como NULL na cláusula SELECT. Exemplo: select 'a', null, col_name from table_name;.

O que fazer se o erro "a single instance cannot output data to more than 10000 partitions" for relatado ao executar uma instrução INSERT INTO ou INSERT OVERWRITE?

  • Sintomas

    A execução de uma instrução INSERT INTO ou INSERT OVERWRITE retorna o seguinte erro:

    FAILED: ODPS-0123031:Partition exception - a single instance cannot output data to more than 10000 partitions
  • Causa

    Uma tabela do MaxCompute pode ter até 60.000 partições, mas um único job grava dados em no máximo 10.000 partições de saída. Esse erro geralmente ocorre devido à configuração incorreta do campo de partição. Por exemplo, particionar uma tabela por um campo de ID pode gerar partições em excesso.

  • Solução

    Um job que gera milhares de partições dinâmicas é considerado grande. Se produzir mais de 10.000 partições, isso pode indicar problema na lógica de negócios ou na sintaxe SQL. Após confirmar que a lógica e a sintaxe estão corretas, evite esse erro alterando o campo de partição da tabela ou dividindo a lógica de negócios em múltiplos jobs.

O que fazer se o erro "invalid dynamic partition value" for relatado ao inserir dados em uma partição dinâmica de uma tabela MaxCompute?

  • Sintomas

    A tentativa de inserir dados em uma partição dinâmica retorna o seguinte erro:

    FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=Shanghai
  • Causa

    Esse erro ocorre quando um valor inválido é usado para uma partição dinâmica. O particionamento dinâmico cria partições com base em campos especificados, cujos valores não podem conter caracteres especiais ou chineses.

  • Solução

    Ao inserir dados em partições dinâmicas, observe as seguintes restrições:

    • Em ambientes distribuídos, um único processo gera no máximo 512 partições dinâmicas.

    • Uma instrução SQL de partição dinâmica não pode gerar mais de 2.000 partições dinâmicas.

    • Valores de partição gerados dinamicamente não podem ser NULL.

    • Se a tabela de destino tiver vários níveis de partição, especifique algumas partições como estáticas ao executar uma instrução INSERT. As partições estáticas devem corresponder aos níveis superiores.

O que fazer se um erro for relatado ao inserir dados FLOAT em uma tabela MaxCompute?

Para obter mais informações sobre os tipos de dados básicos compatíveis com o MaxCompute V2.0, consulte Data type versions. O tipo de dados FLOAT não possui definição de constante. Para inserir dados FLOAT, use a função CAST para converter o tipo de dado. Por exemplo, cast(5.1 as float) converte a string '5.1' no valor FLOAT 5.1.

Para usar novos tipos de dados como TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP ou BINARY no MaxCompute SQL, ative-os por meio de um dos métodos a seguir:

  • Nível de sessão: adicione set odps.sql.type.system.odps2=true; antes da instrução SQL e envie ambos juntos.

  • Nível de projeto: o proprietário do projeto executa setproject odps.sql.type.system.odps2=true; para habilitar os novos tipos de dados no projeto.

Por que os resultados de uma operação INSERT SELECT e de uma operação SELECT diferem para os mesmos dados?

  • Sintomas

    Ao executar instruções SQL no mesmo campo STRING, o número de casas decimais apresenta inconsistência. Uma operação SELECT mantém duas casas decimais, enquanto uma operação INSERT SELECT exibe múltiplas casas decimais.

  • Causas

    Em uma operação INSERT SELECT, quando um campo STRING é convertido implicitamente para DECIMAL, o valor é primeiro convertido para DOUBLE antes da operação ROUND. Devido à imprecisão do tipo DOUBLE, o resultado da operação ROUND ainda pode apresentar várias casas decimais.

  • Solução

    Use conversão explícita. Utilize a função CAST para converter explicitamente os dados para o tipo DECIMAL.

    case when pcm.abc is null then 0 
                        else round(cast(pcm.abc as decimal) ,2) 
                    end abc                        

Se o tipo de dados de um campo na tabela de destino for VARCHAR(10), um erro será relatado em caso de estouro de dados durante a inserção?

Não. Ao inserir dados em um campo do tipo VARCHAR(10), o sistema trunca os dados se o comprimento exceder o limite.

O que fazer se o erro "Transaction timeout because cannot acquire exclusive lock" for relatado ao executar uma instrução SQL do MaxCompute?

  • Sintomas

    O seguinte erro ocorre durante a execução de uma instrução SQL do MaxCompute:

    Failed to run ddltask - Modify DDL meta encounter exception : ODPS-0121096:MetaStore transaction conflict - Reached maximum retry times because of OTSStorageTxnLockKeyFail(Inner exception: Transaction timeout because cannot acquire exclusive lock.) 
  • Causa

    O MaxCompute permite que múltiplos jobs gravem dados simultaneamente em uma única tabela. Quando vários jobs entram na fase de commit de metadados ao mesmo tempo, cada job precisa adquirir um bloqueio nos metadados da tabela, gravar neles e liberar o bloqueio. Se muitos jobs tentarem isso simultaneamente, os metadados podem permanecer bloqueados por um período prolongado. Isso faz com que outros jobs atinjam o tempo limite enquanto aguardam a aquisição do bloqueio, resultando no erro cannot acquire exclusive lock. Um job atinge o tempo limite se não conseguir adquirir um bloqueio em aproximadamente 30 segundos. A granularidade do bloqueio é no nível da tabela.

  • Solução

    Verifique se há múltiplas operações de leitura e gravação sendo executadas na mesma tabela ou partição ao mesmo tempo. Evite realizar operações simultâneas de leitura e gravação em uma tabela ou partição.

Como atualizar dados em uma tabela ou partição do MaxCompute?

O MaxCompute oferece suporte a atualizações no nível de linha para dados em tabelas transacionais usando a operação update.

Se você executar uma operação update em uma tabela não transacional, o sistema relatará o erro trying to update a non-transactional table is not allowed. Set tblproperties ("transactional" = "true") to use this feature.

Importe dados de uma partição ou tabela de source para uma partição ou tabela de destino e execute operações de atualização durante a importação. O destino também pode ser o próprio source, configuração conhecida como atualização local (in-place update).

Nota

Para obter mais informações sobre como criar uma tabela transacional, consulte Table operations. O MaxCompute permite definir a propriedade transacional apenas no momento da criação da tabela. Não é possível usar alter table para modificar a propriedade transacional de uma tabela existente.

Como excluir dados de uma tabela ou partição do MaxCompute?

O MaxCompute oferece suporte a exclusões no nível de linha para dados em tabelas transacionais por meio da operação delete.

Caso a tabela não seja transacional, exclua os dados das seguintes formas:

  • Exclua a tabela inteira executando o comando DROP.

  • Para tabelas não particionadas, execute o comando truncate table table_name; para remover todos os dados da tabela ou utilize o comando insert overwrite para obter um resultado semelhante.

    • Exemplo 1: excluir dados onde Col=1 da tabela TableA.

      insert overwrite table TableA select a,b,c.... from TableA where Col <> 1;
    • Exemplo 2: excluir todos os dados.

      insert overwrite table TableA select a,b,c.... from TableA where 1=2;
  • Em tabelas particionadas, execute o comando alter table table_name drop if exists partition(partition_name='specific_partition_value') para excluir a partição correspondente.

    Por exemplo, se a coluna chave de partição da tabela testtable for ds, execute o comando abaixo para excluir a partição ds='20170520':

    alter table testtable drop if exists partition (ds='20170520');
  • Utilize uma instrução INSERT com uma cláusula WHERE para importar os dados necessários para uma nova partição ou tabela. A tabela de source e a tabela de destino da instrução INSERT podem ser a mesma.

    insert overwrite table sale_detail select * from sale_detail where name='mengyonghui';

Como excluir dados duplicados de uma tabela não particionada com grande volume de dados?

Se todas as colunas nas linhas duplicadas forem idênticas, realize uma operação GROUP BY em todas as colunas. Por exemplo, se a tabela não particionada table1 tiver as colunas c1, c2 e c3, execute o seguinte comando:

insert overwrite table table1 select c1, c2, c3 from table1 group by

 c1, c2, c3;
Nota

Faça backup dos seus dados antes de executar essa operação. Com base no volume de dados, avalie se o custo desse método é inferior ao custo de reimportar os dados.