En utilisant AWS re:Post, vous acceptez les AWS re:Post Conditions d’utilisation

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 »?

Lecture de 4 minute(s)
0

Ma requête Amazon Athena échoue avec l'erreur « HIVE_INVALID_METADATA : Hive metadata for table sample_table is invalid: Table descriptor contains duplicate columns ».

Brève description

Cette erreur se produit lorsque le schéma de 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

Détection de noms de colonnes dupliqués

Pour identifier la colonne dupliquée, exécutez la commande SHOW CREATE TABLE pour récupérer le schéma de la table. Vous pouvez également consulter le schéma de la table dans la console AWS Glue. Dans l'exemple suivant, il existe deux colonnes 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 ce problème, 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. Choisissez le nom de la table dans la liste, puis choisissez Modifier le schéma.
  3. Choisissez le nom de la colonne, saisissez un nouveau nom, puis choisissez Enregistrer.

Détection de colonnes de table et de colonnes de partition portant le même nom

Pour détecter d’éventuels noms de colonnes de partition et de table dupliqués, consultez 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 la colonneType de donnéesClé de partition
idint
namechaîne
idchaînePartition (0)

Utilisez l'une des méthodes suivantes pour résoudre le problème :

  • Renommez la colonne de partition dans le chemin 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, utilisez la fonction de mappage au lieu du robot AWS Glue pour recréer manuellement la table. Ajoutez ensuite des partitions dans Athena. Dans l'exemple suivant, la table AWS Glue pointe vers s3://doc-example-bucket/athenajsontesting/, dont la structure de partition correspond à s3://doc-example-bucket/athenajsontesting/id=12. Une fois la table créée, 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')

Détection de clés dupliquées dans les données source JSON

Si les données source JSON contiennent des noms de colonnes qui ne diffèrent que par l’utilisation de majuscules, par exemple {"Username": "bob1234", "username": "bob" }, consultez la section Pourquoi est-ce que je reçois des erreurs lorsque j'essaie de lire des données JSON dans Amazon Athena ? Par défaut, Athena ne distingue pas les majuscules et les minuscules. Athena considèrera donc « 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.

Détection de clés dupliquées dans les données sources Parquet

Si la source de données est au format Parquet et que la table comporte une colonne dupliquée, vous devez modifier le nom de l'une des colonnes. Définissez la propriété SerDe parquet.column.index.access sur true. Parquet accède aux colonnes par nom et ORC par index.

Pour en savoir plus, consultez la page Gestion des mises à jour de schémas.

Informations connexes

Bibliothèques JSON SerDe

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 10 mois