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 :

  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 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.


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


Besoin d'aide pour une question technique ou de facturation ?