Pourquoi ma requête Athena échoue-t-elle avec l'erreur « HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns » ?

Date de la dernière mise à jour : 29/07/2022

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 :

  1. Ouvrez la console AWS Glue.
  2. Sélectionnez le nom de la table dans la liste, puis Edit schema (Modifier le schéma).
  3. 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 au format JSON, recréez manuellement la table et ajoutez des partitions dans Athena à l'aide de la fonction de mappage au lieu d'utiliser un crawler 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 Pourquoi est-ce que je reçois des erreurs en essayant 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.


Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?