Tous les produits
Search
Centre de documentation

MaxCompute:Insérer ou écraser des données dans des partitions dynamiques

Dernière mise à jour :Aug 21, 2026

MaxCompute permet d'insérer des données dans des partitions dynamiques à l'aide de l'instruction INSERT INTO ou INSERT OVERWRITE.

Prérequis

Pour exécuter les opérations INSERT INTO et INSERT OVERWRITE, vous devez disposer de l'autorisation Update sur la table cible et de l'autorisation Select sur la table source. Pour plus d'informations sur l'octroi des autorisations, consultez la rubrique Autorisations MaxCompute.

Fonctionnement

Lorsque vous utilisez MaxCompute SQL pour traiter des données, ne spécifiez pas directement les valeurs de partition dans une instruction INSERT INTO ou INSERT OVERWRITE. Indiquez uniquement les colonnes de partition. Les valeurs correspondantes sont fournies dans la clause SELECT ; le système insère alors automatiquement les données dans les partitions appropriées en fonction de ces valeurs.

Pour obtenir des informations sur l'insertion de données dans des partitions statiques, consultez la rubrique Insérer ou écraser des données (INSERT INTO | INSERT OVERWRITE).

Limites

Les limitations relatives à l'insertion de données dans des partitions dynamiques via les opérations INSERT INTO et INSERT OVERWRITE sont les suivantes :

  • Une instruction INSERT INTO peut générer jusqu'à 10 000 partitions dynamiques. Une instruction INSERT OVERWRITE peut en générer jusqu'à 60 000.

  • Dans un environnement distribué, un processus unique exécutant une instruction SQL pour une opération de partition dynamique peut écrire dans un maximum de 512 partitions dynamiques. Au-delà, la tâche échoue.

  • La valeur d'une partition générée dynamiquement ne peut pas être NULL. Elle ne doit pas non plus contenir de caractères spéciaux ni de caractères chinois. Dans le cas contraire, l'erreur suivante est renvoyée : FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx.

    Remarque

    La valeur d'une colonne de clé de partition ne peut pas contenir de caractères double-octet, tels que les caractères chinois. Elle doit commencer par une lettre et peut inclure des lettres, des chiffres et certains caractères spéciaux pris en charge. Sa longueur doit être comprise entre 1 et 255 octets. Les caractères spéciaux suivants sont pris en charge : espaces, deux-points (:), traits de soulignement (_), signes dollar ($), dièses (#), points (.), points d'exclamation (!) et arobases (@). Le comportement des autres caractères n'est pas défini, notamment les caractères d'échappement \t, \n et /.

  • Les tables clusterisées ne prennent pas en charge les partitions dynamiques.

Remarques d'utilisation

Lors de l'insertion de données dans une partition dynamique, tenez compte des points suivants :

  • Si la partition de destination n'existe pas lors de l'exécution d'une instruction INSERT INTO PARTITION, MaxCompute la crée automatiquement.

  • Si plusieurs tâches INSERT INTO PARTITION concurrentes tentent d'écrire dans une partition inexistante, seule la première tâche réussie crée la partition. Une seule partition est ainsi créée.

  • Si vous ne pouvez pas contrôler la concurrence des tâches INSERT INTO PARTITION, créez les partitions à l'avance à l'aide de la commande ALTER TABLE. Pour plus d'informations, consultez la rubrique Opérations sur les partitions.

  • Si la table de destination comporte plusieurs niveaux de partition, vous pouvez définir certaines partitions comme statiques dans une instruction INSERT. Toutefois, les partitions statiques doivent se situer à un niveau supérieur à celui des partitions dynamiques.

  • Lors de l'insertion de données dans une partition dynamique, les colonnes de partition dynamique doivent figurer dans la liste SELECT. À défaut, l'instruction échoue.

Syntaxe

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

Paramètres

Paramètre

Obligatoire

Description

table_name

Oui

Nom de la table de destination.

ptcol_name

Oui

Nom d'une colonne de partition dans la table de destination.

select_statement

Oui

Clause SELECT qui interroge les données de la table source à insérer dans la table de destination.

Le mappage entre les colonnes de la liste SELECT et les partitions dynamiques est déterminé par l'ordre des colonnes, et non par leur nom. Les dernières colonnes de la liste SELECT fournissent les valeurs des colonnes de partition dynamique. Par exemple, si une table possède une seule partition dynamique, la dernière colonne de la liste SELECT sert de valeur de partition. Si l'ordre des colonnes de la table source diffère de celui de la table de destination, énumérez explicitement les colonnes dans votre select_statement afin de garantir le bon ordre.

from_statement

Oui

Clause FROM qui spécifie la source des données, telle que le nom de la table source.

Exemple de données

-- 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      |
+------------+-------------+-------------+------------+------------+

Exemples

Les exemples suivants utilisent les données de la table sale_detail créée dans la section Exemple de données.

  • Cet exemple insère des données dans une table de destination. Les partitions dynamiques résultantes sont déterminées par les valeurs de la colonne 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      |
    +------------+------------+        
  • Cet exemple insère des données dans une table partitionnée à plusieurs niveaux et spécifie la valeur de la partition de premier niveau, 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      |
    +------------+-------------+-------------+------------+------------+
  • Exemple 3 : Dans le partitionnement dynamique, le mappage entre les champs de l'instruction select_statement et les partitions dynamiques de la table de destination est déterminé par l'ordre des champs, et non par les noms de colonne. Voici un exemple de commande :

    -- 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       |
    +------------+-------------+-------------+------------+------------+
  • Exemple 4 (Incorrect) : Cet exemple échoue car la colonne de partition dynamique n'est pas incluse dans la liste SELECT.

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

    Résultat :

    FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 3 in data source, requires 4 columns (includes dynamic partitions if any)
  • Exemple 5 (Incorrect) : Cet exemple échoue car une partition de niveau supérieur ne peut pas être dynamique si une partition de niveau inférieur est statique.

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

    Résultat :

    FAILED: ODPS-0130071:[1,72] Semantic analysis exception - static partition region must be a high level partition than any dynamic partitions
  • Exemple 6 : Lors de l'insertion de données dans une partition dynamique, MaxCompute effectue une conversion implicite si le type de données de la colonne de partition ne correspond pas strictement à celui de la colonne correspondante dans l'instruction SELECT. Voici un exemple de commande :

    -- 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 |
    +------------+------------+------------+
    Remarque

    Les insertions dans des partitions dynamiques peuvent disperser des données ordonnées, ce qui risque de réduire le taux de compression. Pour optimiser la compression, utilisez une commande Tunnel afin de charger des données dans des partitions dynamiques. Pour un exemple détaillé d'utilisation de cette commande, consultez la rubrique Migrer des données d'ApsaraDB RDS vers MaxCompute selon le partitionnement dynamique.