Perché la mia query Athena fallisce con l'errore "HIVE_INVALID_METADATA: I metadati Hive per la tabella non sono validi: Il descrittore della tabella contiene colonne duplicate”?
La mia query Amazon Athena fallisce con l'errore "HIVE_INVALID_METADATA: I metadati Hive per la tabella sample_table non sono validi: Il descrittore della tabella contiene colonne duplicate”.
Breve descrizione
Questo errore si verifica quando lo schema della tabella AWS Glue contiene nomi di colonne duplicati o colonne con lo stesso nome delle colonne di partizione.
Soluzione
Controlla i nomi delle colonne duplicate
Per identificare la colonna duplicata, esegui SHOW CREATE TABLE per recuperare lo schema della tabella. Oppure, visualizza lo schema della tabella nella console AWS Glue. Nell'esempio seguente, ci sono due colonne denominate "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' )
Per risolvere l'errore, esegui CREATE TABLE per ricreare la tabella Athena con nomi di colonna univoci. Oppure, usa la console AWS Glue per rinominare le colonne duplicate:
- Apri la console AWS Glue.
- Scegli il nome della tabella nell'elenco, quindi scegli Modifica schema.
- Scegli il nome della colonna, inserisci un nuovo nome, quindi scegli Salva.
Controlla le colonne della tabella e le colonne delle partizioni con lo stesso nome
Per verificare la presenza di nomi duplicati delle colonne delle partizioni e delle colonne della tabella, visualizza lo schema della tabella nella console AWS Glue. Nell'esempio seguente, la colonna della partizione e la colonna della tabella sono entrambe denominate “id”.
Dati di esempio:
{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" }
Definizione della tabella:
Nome colonna | Tipo di dati | Chiave di partizione |
id | int | |
nome | stringa | |
id | stringa | Partizione (0) |
Utilizza una delle seguenti opzioni per risolvere il problema:
- Rinomina la colonna delle partizioni nel percorso Amazon Simple Storage Service (Amazon S3).
- Rinomina il nome della colonna nei dati e nella definizione della tabella AWS Glue.
- Se i dati di origine sono JSON, utilizza la funzione di mappatura anziché il crawler AWS Glue per ricreare manualmente la tabella. Quindi, aggiungi le partizioni in Athena. Nell'esempio seguente, la tabella AWS Glue fa riferimento a s3://doc-example-bucket/athenajsontesting/, che ha questa struttura di partizione: s3://doc-example-bucket/athenajsontesting/id=12. Dopo avere creato la tabella, utilizza MSCK REPAIR TABLE per caricare la partizione.
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')
Controlla i dati di origine JSON per le chiavi duplicate
Se i dati di origine JSON contengono nomi di colonne che differiscono solo per le maiuscole (ad esempio, {"Username": "bob1234", "username": "bob" }), consulta Perché ricevo errori quando provo a leggere i dati JSON in Amazon Athena? Per impostazione predefinita, Athena non fa distinzione tra maiuscole e minuscole. Athena tratta “Username” e “username” come chiavi duplicate, a meno che non si utilizzi OpenX SerDe e si imposti la proprietà case.insensitive sufalse.
Controlla la presenza di chiavi duplicate nei dati di origine Parquet
Se l'origine dati è in formato Parquet e la tabella ha una colonna duplicata, modifica uno dei nomi delle colonne. Imposta la proprietà SerDe parquet.column.index.access su true. Parquet accede alle colonne per nome e ORC per indice.
Per ulteriori informazioni, consulta Handling schema updates.
Informazioni correlate
Contenuto pertinente
- AWS UFFICIALEAggiornata 8 mesi fa
- AWS UFFICIALEAggiornata 8 mesi fa
- AWS UFFICIALEAggiornata 8 mesi fa