Ma requête Athena échoue avec l'erreur « HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns ».
Dernière mise à jour : 17/12/2020
Ma requête Amazon Athena échoue avec l'erreur « HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns ».
Brève description
Cette erreur se produit lorsque le schéma de la table AWS Glue contient des noms de colonnes dupliqués ou des colonnes portant le même nom que les colonnes de partition.
Résolution
Rechercher les noms de colonnes dupliqués
Pour identifier la colonne dupliquée, exécutez la commande SHOW CREATE TABLE afin de récupérer le schéma de la table. Vous pouvez également afficher le schéma de la table dans la console AWS Glue. Dans l'exemple suivant, deux colonnes sont nommées « column1 ».
CREATE EXTERNAL TABLE `athenatestingduplicatecolumn_athenatesting`(
`column1` bigint,
`column2` bigint,
`column3` bigint,
`column1` bigint)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://doc-example-bucket/athenatesting/'
TBLPROPERTIES (
'classification'='csv',
'skip.header.line.count'='1'
)
Pour résoudre l'erreur, exécutez la commande CREATE TABLE pour recréer la table Athena avec des noms de colonnes uniques. Vous pouvez également utiliser la console AWS Glue pour renommer les colonnes dupliquées :
- Ouvrez la console AWS Glue.
- Sélectionnez le nom de la table dans la liste, puis Edit schema (Modifier le schéma).
- Sélectionnez le nom de la colonne, saisissez un nouveau nom, puis sélectionnez Save (Enregistrer).
Rechercher les colonnes de table et les colonnes de partition qui ont le même nom
Pour chercher les noms de colonne de partition et de colonne de table dupliqués, affichez le schéma de la table dans la console AWS Glue. Dans l'exemple suivant, la colonne de partition et la colonne de table sont toutes deux nommées « id ».
Exemples de données :
{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
Définition de la table :
Nom de colonne | Type de données | Clé de partition |
id | int | |
name | string | |
id | string | Partition (0) |
Utilisez l'une des options suivantes pour résoudre le problème :
- Renommez la colonne de partition dans le chemin d'accès Amazon Simple Storage Service (Amazon S3).
- Renommez le nom de la colonne dans les données et dans la définition de la table AWS Glue.
- Si les données source sont JSON, recréez manuellement la table et ajoutez des partitions dans Athena à l'aide de la fonction de mappage au lieu d'utiliser un analyseur AWS Glue. Dans l'exemple suivant, la table AWS Glue pointe vers s3://doc-example-bucket/athenajsontesting/, dont la structure de partition est la suivante : s3://doc-example-bucket/athenajsontesting/id=12. Après avoir créé la table, utilisez la commande MSCK REPAIR TABLE pour charger la partition.
CREATE EXTERNAL TABLE `athenajsontest_athenajsontesting2`(
`id1` int COMMENT 'from deserializer',
`name` string COMMENT 'from deserializer')
PARTITIONED BY (
`id` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'mapping.id1'='id')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://doc-example-bucket/athenajsontesting'
TBLPROPERTIES (
'classification'='json',
'transient_lastDdlTime'='1578399113')
Vérifier si les données sources JSON contiennent des clés dupliquées
Si les données sources JSON contiennent des noms de colonne qui ne diffèrent que par la casse ({"Username": "bob1234", "username": "bob" }), consultez Je reçois des erreurs lorsque j'essaie de lire des données JSON dans Amazon Athena. Par défaut, Athena n'est pas sensible à la casse. Athena traite « Username » et « username » comme des clés dupliquées, sauf si vous utilisez OpenX SerDe et définissez la propriété case.insensitive sur false.
Informations connexes
Cet article vous a-t-il été utile ?
Besoin d'aide pour une question technique ou de facturation ?