Cette rubrique répond aux questions fréquemment posées (FAQ) concernant l'exécution d'opérations de langage de manipulation de données (LMD) sur des tables.
|
Catégorie |
FAQ |
|
Insertion ou mise à jour des données |
|
|
Suppression des données |
En cas d'erreur lors d'une opération INSERT, les données d'origine sont-elles corrompues ?
Non, les données d'origine ne sont pas corrompues. MaxCompute garantit l'atomicité. Si une opération INSERT réussit, les données sont mises à jour. En cas d'échec, les données sont restaurées.
Que faire si l'erreur Table xxx has n columns, but query has m columns s'affiche lors de l'exécution d'une instruction INSERT INTO ou INSERT OVERWRITE ?
Lorsque vous insérez des données en exécutant une instruction INSERT INTO ou INSERT OVERWRITE, assurez-vous que les champs de la clause SELECT correspondent à ceux de la table de destination. Le nombre, l'ordre et le type de données des champs doivent être identiques. MaxCompute ne permet pas d'insérer des données dans des champs spécifiques d'une table tout en définissant les autres champs sur NULL ou sur leurs valeurs par défaut. Pour ce faire, définissez les valeurs sur NULL dans la clause SELECT. Par exemple : select 'a', null, col_name from table_name;.
Que faire si l'erreur « a single instance cannot output data to more than 10000 partitions » s'affiche lors de l'exécution d'une instruction INSERT INTO ou INSERT OVERWRITE ?
-
Symptômes
Lorsque vous exécutez une instruction INSERT INTO ou INSERT OVERWRITE, l'erreur suivante s'affiche.
FAILED: ODPS-0123031:Partition exception - a single instance cannot output data to more than 10000 partitions -
Cause
Une table MaxCompute peut comporter jusqu'à 60 000 partitions. Toutefois, une tâche unique peut écrire des données dans un maximum de 10 000 partitions d'une table de sortie. Cette erreur survient généralement parce que le champ de partition est incorrectement configuré. Par exemple, le partitionnement d'une table par un champ ID peut générer un nombre excessif de partitions.
-
Solution
Une tâche qui génère plusieurs milliers de partitions dynamiques est considérée comme volumineuse. Si une tâche produit plus de 10 000 partitions, cela peut indiquer un problème au niveau de la logique métier ou de la syntaxe SQL. Si vous confirmez que la logique et la syntaxe sont correctes, vous pouvez éviter cette erreur en modifiant le champ de partition de la table partitionnée ou en divisant la logique métier en plusieurs tâches.
Que faire si l'erreur « invalid dynamic partition value » s'affiche lors de l'insertion de données dans une partition dynamique d'une table MaxCompute ?
-
Symptômes
Lorsque vous insérez des données dans une partition dynamique, l'erreur suivante s'affiche.
FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=Shanghai -
Cause
Cette erreur se produit lorsqu'une valeur non valide est utilisée pour une partition dynamique. Le partitionnement dynamique crée des partitions basées sur des champs spécifiés. Les valeurs de ces champs de partition ne peuvent pas contenir de caractères spéciaux ni de caractères chinois.
-
Solution
Lors de l'insertion de données dans des partitions dynamiques, tenez compte des points suivants :
Dans un environnement distribué, un processus unique peut générer un maximum de 512 partitions dynamiques lors de l'insertion de données.
Une instruction SQL de partition dynamique ne peut pas générer plus de 2 000 partitions dynamiques.
Les valeurs de partition générées dynamiquement ne peuvent pas être NULL.
Si la table de destination comporte plusieurs niveaux de partition, vous pouvez spécifier certaines partitions comme statiques lors de l'exécution d'une instruction INSERT. Toutefois, les partitions statiques doivent correspondre aux niveaux supérieurs.
Que faire en cas d'erreur lors de l'insertion de données FLOAT dans une table MaxCompute ?
Pour plus d'informations sur les types de données de base pris en charge par MaxCompute V2.0, consultez la section Versions des types de données. Le type de données FLOAT ne possède pas de définition de constante. Pour insérer des données FLOAT, utilisez la fonction CAST afin de convertir le type de données. Par exemple, cast(5.1 as float) convertit la chaîne '5.1' en la valeur FLOAT 5.1.
Lorsque vous utilisez de nouveaux types de données tels que TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP ou BINARY dans MaxCompute SQL, vous devez les activer à l'aide de l'une des méthodes suivantes :
Niveau session : ajoutez
set odps.sql.type.system.odps2=true;avant l'instruction SQL et soumettez-les ensemble.Niveau projet : le propriétaire du projet exécute
setproject odps.sql.type.system.odps2=true;pour activer les nouveaux types de données pour le projet.
Pourquoi les résultats d'une opération INSERT SELECT et d'une opération SELECT diffèrent-ils pour les mêmes données ?
-
Symptômes
Lorsque vous exécutez des instructions SQL sur le même champ STRING, le nombre de décimales est incohérent. Une opération SELECT conserve deux décimales, tandis qu'une opération INSERT SELECT affiche plusieurs décimales.
-
Causes
Lors d'une opération INSERT SELECT, lorsqu'un champ STRING est implicitement converti en type DECIMAL, la valeur est d'abord convertie en type DOUBLE avant qu'une opération ROUND ne soit effectuée. Étant donné que le type DOUBLE est imprécis, le résultat de l'opération ROUND peut toujours présenter plusieurs décimales.
-
Solution
Utilisez une conversion explicite. Servez-vous de la fonction
CASTpour convertir explicitement les données vers le typeDECIMAL.case when pcm.abc is null then 0 else round(cast(pcm.abc as decimal) ,2) end abc
Si le type de données d'un champ dans la table de destination est VARCHAR(10), une erreur est-elle signalée en cas de dépassement de capacité lors d'une insertion ?
Non. Lorsque vous insérez des données dans un champ de type VARCHAR(10), les données sont tronquées si leur longueur dépasse la limite.
Que faire si l'erreur « Transaction timeout because cannot acquire exclusive lock » s'affiche lors de l'exécution d'une instruction SQL MaxCompute ?
-
Symptômes
L'erreur suivante se produit lors de l'exécution d'une instruction SQL 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.) -
Cause
MaxCompute permet à plusieurs tâches d'écrire des données simultanément dans une seule table. Lorsque plusieurs tâches entrent en phase de validation des métadonnées en même temps, chacune doit acquérir un verrou sur les métadonnées de la table, y écrire, puis libérer le verrou. Si de nombreuses tâches tentent cette opération simultanément, les métadonnées peuvent rester verrouillées pendant une période prolongée. Cela peut entraîner l'expiration du délai d'attente d'autres tâches en attente d'acquisition du verrou, provoquant ainsi l'erreur
cannot acquire exclusive lock. Une tâche expire si elle ne parvient pas à acquérir un verrou dans un délai d'environ 30 secondes. La granularité du verrou se situe au niveau de la table. -
Solution
Vérifiez si plusieurs opérations de lecture et d'écriture sont effectuées simultanément sur la même table ou la même partition de table. Évitez d'effectuer plusieurs opérations de lecture et d'écriture sur une table ou une partition de table en même temps.
Comment mettre à jour les données d'une table ou d'une partition MaxCompute ?
MaxCompute prend en charge les mises à jour au niveau des lignes des données dans les tables transactionnelles à l'aide de l'opération update.
Si vous exécutez une opération update sur une table non transactionnelle, l'erreur trying to update a non-transactional table is not allowed. Set tblproperties ("transactional" = "true") to use this feature s'affiche.
Vous pouvez importer des données depuis une partition ou une table source vers une partition ou une table de destination et exécuter des opérations de mise à jour pendant l'importation. La destination peut également être la source elle-même, ce que l'on appelle une mise à jour sur place.
Pour plus d'informations sur la création d'une table transactionnelle, consultez la section Opérations sur les tables. MaxCompute vous permet de définir la propriété transactionnelle uniquement lors de la création d'une table. Vous ne pouvez pas utiliser alter table pour modifier la propriété transactionnelle d'une table existante.
Comment supprimer des données d'une table ou d'une partition MaxCompute ?
MaxCompute prend en charge les suppressions au niveau des lignes des données dans les tables transactionnelles à l'aide de l'opération delete.
Si la table n'est pas une table transactionnelle, vous pouvez supprimer des données de la manière suivante :
Supprimez la table entière en exécutant la commande
DROP.-
Pour une table non partitionnée, exécutez la commande
truncate table table_name;afin de supprimer toutes les données de la table, ou utilisez la commandeinsert overwritepour obtenir un résultat similaire.-
Exemple 1 : Supprimez les données où
Col=1deTableA.insert overwrite table TableA select a,b,c.... from TableA where Col <> 1; -
Exemple 2 : Supprimez toutes les données.
insert overwrite table TableA select a,b,c.... from TableA where 1=2;
-
-
Pour une table partitionnée, exécutez la commande
alter table table_name drop if exists partition(partition_name='specific_partition_value')afin de supprimer la partition correspondante.Par exemple, la colonne de clé de partition de la table
testtableestds. Exécutez la commande suivante pour supprimer la partitionds='20170520'.alter table testtable drop if exists partition (ds='20170520'); -
Utilisez une instruction INSERT avec une clause WHERE pour importer les données requises dans une nouvelle partition ou table. La table source et la table de destination de l'instruction INSERT peuvent être identiques.
insert overwrite table sale_detail select * from sale_detail where name='mengyonghui';
Si une table non partitionnée contient un grand volume de données, comment supprimer les données en double ?
Si toutes les colonnes des lignes en double sont identiques, vous pouvez effectuer une opération GROUP BY sur toutes les colonnes. Par exemple, si la table non partitionnée table1 comporte les colonnes c1, c2 et c3, vous pouvez exécuter la commande suivante.
insert overwrite table table1 select c1, c2, c3 from table1 group by
c1, c2, c3;
Avant d'effectuer cette opération, sauvegardez vos données. En fonction du volume de données, évaluez si le coût de cette méthode est inférieur à celui de la réimportation des données.