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 INTOpeut générer jusqu'à 10 000 partitions dynamiques. Une instructionINSERT OVERWRITEpeut 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.RemarqueLa 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,\net/. 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 PARTITIONconcurrentes 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 commandeALTER 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 Le mappage entre les colonnes de la liste |
|
from_statement |
Oui |
Clause |
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 | +------------+------------+------------+RemarqueLes 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.