Todos os produtos
Search
Central de documentação

MaxCompute:Inserir ou sobrescrever dados em partições dinâmicas

Última atualização: Aug 21, 2026

O MaxCompute permite inserir dados em partições dinâmicas com a instrução INSERT INTO ou INSERT OVERWRITE.

Pré-requisitos

Para executar operações INSERT INTO e INSERT OVERWRITE, você precisa ter permissão Update na tabela de destino e permissão Select na tabela de origem. Para mais informações sobre como conceder permissões, consulte MaxCompute Permissions.

Funcionamento

Ao processar dados com SQL do MaxCompute, não especifique diretamente os valores de partição em uma instrução INSERT INTO ou INSERT OVERWRITE. Especifique apenas as colunas de partição. Forneça os valores dessas colunas na cláusula SELECT para que o sistema insira automaticamente os dados nas partições correspondentes.

Para obter informações sobre como inserir dados em partições estáticas, consulte Insert or overwrite data (INSERT INTO | INSERT OVERWRITE).

Limites

As restrições para inserção de dados em partições dinâmicas com as operações INSERT INTO e INSERT OVERWRITE são:

  • Uma instrução INSERT INTO gera até 10.000 partições dinâmicas. Uma instrução INSERT OVERWRITE gera até 60.000 partições dinâmicas.

  • Em ambientes distribuídos, um único processo que executa uma instrução SQL para operação de partição dinâmica grava em no máximo 512 partições dinâmicas. Caso contrário, o job falha.

  • Valores de partição gerados dinamicamente não podem ser NULL nem conter caracteres especiais ou chineses. Se isso ocorrer, o sistema reporta o seguinte erro: FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx.

    Nota

    O valor de uma coluna de chave de partição não pode conter caracteres de byte duplo, como caracteres chineses. Esse valor deve começar com uma letra e pode incluir letras, dígitos e caracteres especiais suportados, com comprimento entre 1 e 255 bytes. Os caracteres especiais permitidos são: espaços, dois-pontos (:), sublinhados (_), cifrões ($), cerquilhas (#), pontos (.), pontos de exclamação (!) e arrobas (@). O comportamento de outros caracteres não é definido, incluindo caracteres de escape como \t, \n e /.

  • Tabelas clusterizadas não oferecem suporte a partições dinâmicas.

Observações de uso

Ao inserir dados em uma partição dinâmica, observe os seguintes pontos:

  • Se a partição de destino não existir durante a execução de uma instrução INSERT INTO PARTITION, o MaxCompute a cria automaticamente.

  • Quando múltiplos jobs INSERT INTO PARTITION concorrentes tentam gravar em uma partição inexistente, apenas o primeiro job bem-sucedido cria a partição. Somente uma partição é criada.

  • Caso não seja possível controlar a concorrência dos jobs INSERT INTO PARTITION, crie as partições antecipadamente com o comando ALTER TABLE. Para mais detalhes, consulte Partition operations.

  • Se a tabela de destino tiver vários níveis de partição, defina algumas como estáticas na instrução INSERT. No entanto, as partições estáticas devem estar em nível hierárquico superior ao das partições dinâmicas.

  • Durante a inserção em partição dinâmica, as colunas correspondentes devem constar na lista SELECT. A ausência desses campos causa falha na instrução.

Sintaxe

INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...]) 
<select_statement> FROM <from_statement>;

Parâmetros

Parâmetro

Obrigatório

Descrição

table_name

Sim

Nome da tabela de destino.

ptcol_name

Sim

Nome de uma coluna de partição na tabela de destino.

select_statement

Sim

Cláusula SELECT que consulta dados da tabela de origem para inserção na tabela de destino.

O mapeamento entre as colunas da lista SELECT e as partições dinâmicas segue a ordem das colunas, e não seus nomes. As últimas colunas da lista SELECT fornecem os valores para as colunas de partição dinâmica. Por exemplo, se houver uma única partição dinâmica, a última coluna da lista SELECT será usada como valor de partição. Se a ordem das colunas da tabela de origem diferir da tabela de destino, liste explicitamente as colunas no seu select_statement para garantir a ordem correta.

from_statement

Sim

Cláusula FROM que especifica a fonte de dados, como o nome da tabela de origem.

Dados de amostra

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

-- Add a partition to the source table. This step is optional. If you do not create the partition in advance, it is automatically created during the data write operation.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china');

-- Append data to the source table. You can omit the TABLE keyword after INSERT INTO and INSERT OVERWRITE.
INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);

-- Enable a full scan. This setting is effective only for the current session. Run a SELECT statement to view the data in the sale_detail table.
SET odps.sql.allow.fullscan=true; 
SELECT * FROM sale_detail;

-- Output:
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
+------------+-------------+-------------+------------+------------+

Exemplos

Os exemplos a seguir utilizam os dados da tabela sale_detail criada na seção Sample data.

  • Este exemplo insere dados em uma tabela de destino. As partições dinâmicas resultantes dependem dos valores da coluna region.

    -- Create a destination table named total_revenues.
    CREATE TABLE total_revenues (revenue DOUBLE) PARTITIONED BY (region string);
    
    -- Insert data from the sale_detail source table into the total_revenues destination table.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE total_revenues PARTITION(region) SELECT total_price AS revenue, region FROM sale_detail;
    
    -- Run the SHOW PARTITIONS statement to view the partitions of the total_revenues table.
    SHOW PARTITIONS total_revenues;
       
    -- Output:
    region=china  
    
    -- Enable a full scan. This setting is effective only for the current session. Run a SELECT statement to view the data in the total_revenues table. 
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM total_revenues;    
    
    -- Output:
    +------------+------------+
    | revenue    | region     |
    +------------+------------+
    | 100.1      | china      |
    | 100.2      | china      |
    | 100.3      | china      |
    +------------+------------+        
  • Este exemplo insere dados em uma tabela com partições multinível e especifica o valor para a partição de primeiro nível, sale_date.

    -- Create a destination table named sale_detail_dypart. 
    CREATE TABLE sale_detail_dypart LIKE sale_detail; 
    
    -- Specify the first-level partition and insert data into the destination table.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region)
    SELECT shop_name,customer_id,total_price,region FROM sale_detail;
    
    -- Enable a full scan. This setting is effective only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- Output:
    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | 2013       | china      |
    | s2         | c2          | 100.2       | 2013       | china      |
    | s3         | c3          | 100.3       | 2013       | china      |
    +------------+-------------+-------------+------------+------------+
  • Exemplo 3: Em particionamento dinâmico, o mapeamento entre os campos do select_statement e as partições dinâmicas da tabela de destino obedece à ordem dos campos, e não aos nomes das colunas. Veja o comando de exemplo:

    -- Insert data from the source table sale_detail into the destination table sale_detail_dypart.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region)
    SELECT shop_name,customer_id,total_price,sale_date,region FROM sale_detail;
    
    -- Enable a full scan. This setting is effective only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- Output:
    -- The sale_date field from the source table maps to the sale_date dynamic partition column of the destination table.
    -- The region field from the source table maps to the region dynamic partition column of the destination table.
    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | 2013       | china      |
    | s2         | c2          | 100.2       | 2013       | china      |
    | s3         | c3          | 100.3       | 2013       | china      |
    +------------+-------------+-------------+------------+------------+
    
    -- Insert data from the sale_detail table into the sale_detail_dypart table and change the SELECT field order.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region)
    SELECT shop_name,customer_id,total_price,region,sale_date FROM sale_detail;
    
    -- Enable a full scan. This setting is effective only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- Output:
    -- The region field from the source table maps to the sale_date dynamic partition column of the destination table.
    -- The sale_date field from the source table maps to the region dynamic partition column of the destination table.
    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | china      | 2013       |
    | s2         | c2          | 100.2       | china      | 2013       |
    | s3         | c3          | 100.3       | china      | 2013       |
    +------------+-------------+-------------+------------+------------+
  • Exemplo 4 (Incorreto): Este exemplo falha porque a coluna de partição dinâmica não foi incluída na lista SELECT.

    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region) 
    SELECT shop_name,customer_id,total_price FROM sale_detail;

    Saída:

    FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 3 in data source, requires 4 columns (includes dynamic partitions if any)
  • Exemplo 5 (Incorreto): Este exemplo falha porque uma partição de nível superior não pode ser dinâmica se uma partição de nível inferior for estática.

    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region='china')
    SELECT shop_name,customer_id,total_price,sale_date FROM sale_detail_dypart;

    Saída:

    FAILED: ODPS-0130071:[1,72] Semantic analysis exception - static partition region must be a high level partition than any dynamic partitions
  • Exemplo 6: Ao inserir dados em partição dinâmica, o MaxCompute realiza uma implicit conversion se o tipo de dado da coluna de partição não corresponder estritamente ao da coluna equivalente na instrução SELECT. Confira o comando abaixo:

    -- Create a source table named src.
    CREATE TABLE src (c INT, d STRING) PARTITIONED BY (e INT);
    
    -- Add a partition to the src source table.
    ALTER TABLE src ADD IF NOT EXISTS PARTITION (e=201312);
    
    -- Append data to the src source table.
    INSERT INTO src PARTITION (e=201312) VALUES (1,100.1),(2,100.2),(3,100.3);
    
    -- Create a destination table named parttable.
    CREATE TABLE parttable(a INT, b DOUBLE) PARTITIONED BY (p STRING);
    
    -- Insert data from the src source table into the parttable destination table.
    SET odps.sql.allow.fullscan=true; 
    INSERT INTO parttable PARTITION (p) SELECT c, d, CURRENT_TIMESTAMP() FROM src;
    
    -- Query the parttable destination table.
    SET odps.sql.allow.fullscan=true;
    SELECT * FROM parttable;
    
    -- Output:
    +------------+------------+------------+
    | a          | b          | p          |
    +------------+------------+------------+
    | 1          | 100.1      | 2024-12-10 15:59:34.492 |
    | 2          | 100.2      | 2024-12-10 15:59:34.492 |
    | 3          | 100.3      | 2024-12-10 15:59:34.492 |
    +------------+------------+------------+
    Nota

    Inserções em partições dinâmicas podem dispersar dados ordenados, o que reduz a taxa de compressão. Para obter melhor compressão, utilize um Tunnel command para carregar dados nas partições dinâmicas. Consulte Migrate data from ApsaraDB RDS to MaxCompute based on dynamic partitioning para ver um exemplo detalhado de uso deste comando.