Cette rubrique décrit les causes possibles de l'erreur ODPS-0130071 : Semantic analysis exception et propose des solutions.
Message d'erreur 1 : the number of input partition columns (n) doesn't equal to table's partition columns (m)
Exemple
FAILED: ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)
Description
La table cible est une table partitionnée comportant m champs de partition. Toutefois, l'instruction SQL d'insertion ne spécifie que n clés de partition (avec n < m). Par conséquent, l'écriture des données dans la partition spécifique échoue et le système renvoie une erreur.
Solutions
Modifiez l'instruction SQL afin que les clés de partition spécifiées correspondent exactement aux champs de partition définis dans la table.
Exemples
-- Create a table.
CREATE TABLE if NOT EXISTS mf_sale_detail
(
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
partitioned BY
(
sale_date string,
region string
);
-- Error: The target table has two partition levels, but the PARTITION clause is either missing or incomplete.
INSERT overwrite TABLE mf_sale_detail
VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
FAILED: ODPS-0130071:[1,24] Semantic analysis exception - the number of input partition columns (0) doesn't equal to table's partition columns (2)
-- Correct: Specify all partitions in the PARTITION clause.
INSERT overwrite TABLE mf_sale_detail PARTITION(sale_date = '2013', region = 'china')
VALUES ('s1', 'c1', 100.1), ('s2', 'c2', 100.2), ('s3', 'c3', 100.3);
OK
-- Correct: Use dynamic partitioning.
INSERT overwrite TABLE mf_sale_detail PARTITION(sale_date = '2013', region)
VALUES ('s1', 'c1', 100.1, 'china'), ('s2', 'c2', 100.2, 'china'), ('s3', 'c3', 100.3, 'china');
OK
Message d'erreur 2 : expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Description
Dans MaxCompute SQL, l'algorithme physique utilisé pour les jointures est le sort-merge join. La condition de jointure doit impérativement inclure une expression d'égalité. Lors de l'exécution de la requête, le brassage des données (shuffling) s'effectue sur la base des colonnes impliquées dans cette expression d'égalité pour les tables de gauche et de droite.
Solutions
Vérifiez que la condition de jointure contient bien une expression d'égalité.
-
Ajoutez un indice map join.
RemarqueSi la condition ON ne contient qu'une expression non équivalente, l'opération de jointure peut générer un volume de données très important, ce qui rallonge considérablement le temps d'exécution de la requête.
Exemples
-- Error: The join condition contains only a non-equality expression.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
FAILED: ODPS-0130071:[4,4] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
-- Correct: The join condition includes an equality expression (t1.key = t2.key) involving columns from both tables.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key AND t1.value > t2.value;
-- Correct: Add a mapjoin hint.
SELECT /*+mapjoin(t1)*/ t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
Message d'erreur 3 : insert into HASH CLUSTERED table/partition xxx is not current supported
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported
Description
L'instruction INSERT INTO ne permet pas d'écrire des données dans une table clusterisée.
Solutions
Convertissez la table en table standard.
Remplacez l'instruction INSERT INTO par une instruction INSERT OVERWRITE.
Exemples
-- Create a clustered table.
CREATE TABLE sale_detail_hashcluster
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
)
clustered BY(customer_id)
sorted BY(customer_id)
INTO 1024 buckets;
-- Error: Using INSERT INTO with a clustered table.
INSERT INTO sale_detail_hashcluster
VALUES ('a', 123, 'id123');
FAILED: ODPS-0130071:[1,13] Semantic analysis exception - insert into HASH CLUSTERED table/partition meta.sale_detail_hashcluster is not current supported
-- Correct: Use INSERT INTO with a common table.
CREATE TABLE sale_detail
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
);
INSERT INTO sale_detail
VALUES ('a', 123, 'id123');
-- Correct: Use INSERT OVERWRITE with the clustered table.
INSERT overwrite TABLE sale_detail_hashcluster
VALUES ('a', 123, 'id123');
Message d'erreur 4 : should appear in GROUP BY key
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key
Description
La clause GROUP BY agrège les données de la table d'entrée selon la clé spécifiée. Après cette opération d'agrégation, les règles suivantes s'appliquent :
Pour la colonne correspondant à la clé d'agrégation, vous pouvez obtenir directement les valeurs de sortie. Vous pouvez également appliquer des fonctions courantes (non agrégatives) pour traiter et calculer davantage les données de cette colonne.
Pour les colonnes ne correspondant pas à la clé d'agrégation, l'accès direct aux valeurs de sortie est impossible. Vous devez utiliser des fonctions d'agrégation telles que SUM, COUNT ou AVG pour calculer les résultats agrégés.
Solutions
Appliquez des fonctions d'agrégation (SUM, COUNT, AVG, ANY_VALUE, etc.) aux colonnes qui ne correspondent pas à la clé d'agrégation afin de calculer le résultat agrégé.
Exemples d'instructions de requête
-- Error: Column `c` is not in the GROUP BY key and is not used in an aggregate function.
SELECT a, sum(b), c
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
-- Error message is returned.
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - column reference t.c should appear in GROUP BY key
-- Correct: Use the aggregate function any_value() on column `c`.
SELECT a, sum(b), any_value(c)
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
Message d'erreur 5 : Invalid partition value
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'
Description
La valeur d'un champ de partition est invalide. Les valeurs des champs de partition dans une table MaxCompute doivent respecter les règles suivantes :
La valeur d'un champ de partition ne doit pas contenir de caractères double-octet (comme les caractères chinois). Sa longueur doit être comprise entre 1 et 128 octets. Elle peut inclure des lettres, des chiffres et certains caractères spéciaux pris en charge, mais doit obligatoirement commencer par une lettre.
Les caractères autorisés sont les espaces, les deux-points (:), les traits de soulignement (_), les signes dollar ($), les dièses (#), les points (.), les points d'exclamation (!) et les arobases (@). Le comportement des autres caractères, tels que les caractères d'échappement
\t,\net/, n'est pas défini.
Solutions
Remplacez la valeur du champ de partition par une valeur valide.
Exemples d'instructions de requête
-- Create a table.
CREATE TABLE mc_test
(
a bigint
)
partitioned BY
(
ds string
);
-- Error: The partition value '${today}' is invalid.
ALTER TABLE mc_test ADD PARTITION(ds = '${today}');
-- Error message is returned.
FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'
-- Correct: Change the partition value to a valid one, such as '20221206'.
ALTER TABLE mc_test ADD PARTITION(ds='20221206');
Message d'erreur 6 : only oss external table support msck repair syntax
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax
Description
Seules les tables externes Object Storage Service (OSS) prennent en charge l'instruction MSCK REPAIR TABLE. Pour plus d'informations, consultez la section Tables externes ORC.
-
Méthode 1 (recommandée) : Découverte et ajout automatiques des partitions.
Cette méthode permet à MaxCompute d'ajouter automatiquement les partitions manquantes à une table externe OSS en se basant sur la structure des répertoires dans OSS. Elle s'avère particulièrement utile pour remplir en masse un grand nombre de partitions historiques en une seule fois.
msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];Remarque
Cette approche ne convient pas à l'ajout de partitions incrémentielles, surtout si un répertoire OSS contient un grand nombre de partitions (par exemple, plus de 1 000). En effet, lorsque le nombre de nouvelles partitions est nettement inférieur au nombre de partitions existantes, l'exécution fréquente de la commande
msckentraîne de nombreuses analyses redondantes du répertoire OSS et de multiples demandes de mise à jour des métadonnées, ce qui réduit considérablement l'efficacité d'exécution. Par conséquent, pour les scénarios nécessitant l'ajout de partitions incrémentielles, nous vous recommandons d'utiliser la Méthode 2. -
Méthode 2 : Ajout manuel des partitions.
Cette méthode est recommandée pour ajouter régulièrement de nouvelles partitions après le chargement initial des partitions historiques. Créez les nouvelles partitions avant d'exécuter vos jobs d'écriture de données. Une fois la partition créée, la table externe peut lire les dernières données du répertoire OSS correspondant sans avoir besoin d'actualiser la partition.
ALTER TABLE < mc_oss_extable_name >ADD PARTITION (< col_name >= < col_value >)[ ADD PARTITION (< col_name >= < col_value >)...][location URL];Les valeurs de col_name et de col_value doivent correspondre aux noms de répertoire des fichiers de données de partition. Par exemple, supposons la structure de répertoire OSS suivante : col_name correspond à
direction, et col_value correspond àN, NE, S, SW, W. Une instructionadd partitioncorrespond à un sous-répertoire unique ; plusieurs sous-répertoires OSS nécessitent donc plusieurs instructionsadd partition.
Exemple
-
Créez un répertoire nommé
demo8dans OSS. Ensuite, créez deux dossiers de partition dans ce répertoire et placez-y les fichiers correspondants.Dossier de partition :
$pt1=1/$pt2=2. Nom du fichier :demo8-pt1.txt.Dossier de partition :
$pt1=3/$pt2=4. Nom du fichier :demo8-pt2.txt.
Créez une table externe et spécifiez les champs
pt.Si les noms des colonnes de partition dans la table externe OSS ne correspondent pas à la structure des répertoires OSS, spécifiez le répertoire explicitement.
--Create an external table
create external table mf_oss_spe_pt (id int, name string)
partitioned by (pt1 string, pt2 string)
stored as TEXTFILE
location "oss://oss-cn-beijing-internal.aliyuncs.com/mfoss*******/demo8/";
--Specify the partition fields
MSCK REPAIR TABLE mf_oss_spe_pt ADD PARTITIONS
with PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
--Query data
select * from mf_oss_spe_pt where pt1=1 and pt2=2;
--Result
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 1 | kyle | 1 | 2 |
| 2 | nicole | 1 | 2 |
+------------+------------+------------+------------+
--Query data
select * from mf_oss_spe_pt where pt1=3 and pt2=4;
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 3 | john | 3 | 4 |
| 4 | lily | 3 | 4 |
+------------+------------+------------+------------+
--The mapping between MaxCompute partitions and OSS directories is as follows:
--pt1=8-->8
--pt2=8-->$pt2=8
--Add a partition
alter table mf_oss_spe_pt add partition (pt1=8,pt2=8)
location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo8/8/$pt2=8/';
--Disable commit mode and insert data
set odps.sql.unstructured.oss.commit.mode=false;
insert into mf_oss_spe_pt partition (pt1=8,pt2=8) values (1,'tere');
--Query data
set odps.sql.unstructured.oss.commit.mode=false;
select * from mf_oss_spe_pt where pt1=8 and pt2=8;
+------+------+-----+-----+
| id | name | pt1 | pt2 |
+------+------+-----+-----+
| 1 | tere | 8 | 8 |
+------+------+-----+-----+
Solutions
Créez une table externe OSS conformément à la documentation avant de pouvoir exécuter la commande MSCK REPAIR.
Exemples d'instructions de requête
--Create a common table
CREATE TABLE mc_test
(
a BIGINT
)
partitioned BY
(
ds string
);
--Error. A common table cannot perform the msck repair operation.
msck TABLE mc_test ADD partitions;
FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax
Message d'erreur 7 : column xx in source has incompatible type yy with destination column zz, which has type ttt
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt
Description
Lors de l'insertion de données dans une table, le type de données de la table de destination doit correspondre au type de données des données insérées, ou bien le type des données insérées doit pouvoir être converti implicitement vers le type de la table de destination. Dans le cas contraire, le système renvoie une erreur.
Solutions
Modifiez l'instruction de requête afin que le type de données des données insérées corresponde au type de données de la table de destination.
Exemples d'instructions de requête
-- Create a table.
odps> CREATE TABLE mc_test
(
a datetime
);
-- Error: The data types are incompatible.
odps> INSERT overwrite TABLE mc_test
VALUES (1L);
FAILED: ODPS-0130071:[2,9] Semantic analysis exception - column __value_col0 in source has incompatible type BIGINT with destination column a, which has type DATETIME
-- Correct: Insert data of the correct type.
odps> INSERT overwrite TABLE mc_test
VALUES (datetime '2022-12-06 14:23:45');
Message d'erreur 8 : function datediff cannot match any overloaded functions with (STRING, STRING, STRING), candidates are BIGINT DATEDIFF(DATE arg0, DATE arg1, STRING arg2); BIGINT DATEDIFF(DATETIME arg0, DATETIME arg1, STRING arg2); BIGINT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1, STRING arg2); INT DATEDIFF(DATE arg0, DATE arg1); INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)
Exemple
ODPS-0130071:[m,n] Semantic analysis exception - function datediff cannot match any overloaded functions with (STRING, STRING, STRING), candidates are BIGINT DATEDIFF(DATE arg0, DATE arg1, STRING arg2); BIGINT DATEDIFF(DATETIME arg0, DATETIME arg1, STRING arg2); BIGINT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1, STRING arg2); INT DATEDIFF(DATE arg0, DATE arg1); INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)
Description
Les types de données des paramètres d'entrée de la fonction DATEDIFF ne correspondent pas. Ce problème d'incompatibilité de type survient souvent parce que les conversions implicites de type de données ne sont pas autorisées lorsque l'édition de type de données MaxCompute V2.0 est activée.
Solutions
Utilisez l'une des méthodes suivantes :
Ajoutez
set odps.sql.type.system.odps2=false;avant la requête SQL et exécutez-les ensemble. Cela désactive le système de type de données 2.0 et active la conversion implicite de type.Modifiez les types de données des paramètres d'entrée.
Message d'erreur 9 : The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole
Exemple
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: java.lang.RuntimeException: {"RequestId":"A7BFAD2F-8982-547A-AB5E-93DAF5061FBD","HostId":"sts.aliyuncs.com","Code":"EntityNotExist.Role","Message":"The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole. ","Recommend":"https://next.api.aliyun.com/troubleshoot?q=EntityNotExist.Role&product=Sts"}
Description
Lors de la création d'une table externe OSS, vous devez spécifier un rôle RAM utilisé pour accéder à OSS. Ici, un rôle RAM inexistant a été utilisé, ce qui provoque l'échec de l'authentification du rôle.
Solutions
Modifiez la valeur du paramètre odps.properties.rolearn . Le format du nom de ressource Alibaba Cloud (ARN) est acs:ram::<UID>:role/<Role> .
Prenez note des informations suivantes :
UID : un numéro à 16 chiffres.
Role : le nom d'un rôle configuré dans la console Resource Access Management (RAM).
Exemples
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'
Pour obtenir l'ARN, accédez à la page Roles . Sur cette page, cliquez sur le nom du rôle pour afficher ses détails.
Dans la console RAM, sur la page Identity Management > Roles, repérez le rôle AliyunPAIAccessingOSSRole dans la liste des rôles.
Sur la page des détails du rôle, dans la section Basic Information, localisez le champ ARN. Cliquez sur le bouton de copie situé à sa droite pour récupérer la valeur de l'ARN.
Message d'erreur 10 : encounter runtime exception while evaluating function MAX_PT
Exemple
FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null
Description
Lors de l'exécution d'une instruction SQL, la partition spécifiée par max_pt est modifiée. Cette modification entraîne une incohérence des données et provoque le renvoi d'une erreur.
Solutions
N'exécutez pas d'instructions SQL spécifiant max_pt pour de nouvelles partitions.
Configurez le système pour qu'il relance automatiquement une tâche de configuration si cette erreur se produit.
Message d'erreur 11 : column xxx cannot be resolved
Exemple
ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved
Description
La colonne xxx n'existe pas dans la table.
Solutions
Vérifiez le script SQL et remplacez xxx par un nom de colonne valide.
Message d'erreur 12 : evaluate function in class XX for user defined function YY does not match annotation ZZ
Exemple
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - evaluate function in class test.MyPlus for user defined function my_plus does not match annotation bigint->bigint
Description
Le code de la fonction définie par l'utilisateur (UDF) Java ou Python ne respecte pas les normes d'écriture des UDF. Les informations contenues dans l'annotation de signature de fonction ne correspondent pas à celles présentes dans le code.
Solutions
Modifiez le code de la UDF afin que les informations de l'annotation de signature de fonction correspondent exactement à celles du code.
Exemples d'instructions de requête
-- The following is an example of an incorrect Python UDF. The implementation has two input parameters, but the annotation specifies only one.
from odps.udf import annotate
@annotate("bigint->bigint")
class MyPlus(object):
def evaluate(self, arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
-- The following is another example of an incorrect Python UDF. The evaluate function is missing the self parameter.
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
def evaluate(arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
-- The following is the correct Python UDF.
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
def evaluate(self, arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
Message d'erreur 13 : Vpc white list: , Vpc id: vpc-xxxx is not allowed to access
Exemple
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.plan.splitting.impl.vpc.AliHyperVpcRuntimeException: Vpc white list: , Vpc id: vpc-xxxx is not allowed to access. Contact project owner to set allowed accessed vpc id list.=
Description
Lorsque vous accédez à des services dans un VPC via une table externe, ce message d'erreur apparaît en raison de configurations VPC invalides.
Solutions
Configurez une liste blanche d'adresses IP dans le VPC et assurez-vous que MaxCompute peut accéder aux services du VPC depuis une adresse IP figurant dans cette liste. Pour plus d'informations, consultez la section « Accès via un VPC (connexion dédiée) » dans la rubrique Processus de connexion réseau .
Message d'erreur 14 : Semantic analysis exception - physical plan generation failed
Exemple
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.common.table.na.NativeException: kNotFound:The role_arn you provide not exists in HOLO auth service. Please check carefully.
Description
Lorsque vous accédez à un service Alibaba Cloud, le rôle lié au service (SLR) associé n'est pas attribué à votre compte Alibaba Cloud. Par conséquent, vous ne pouvez pas accéder aux données du service via ce SLR.
Solutions
Cliquez ici pour attribuer le SLR à votre compte Alibaba Cloud.