Warum schlägt meine Athena-Abfrage mit dem Fehler „HIVE_INVALID_METADATA“: Hive-Metadaten für die Tabelle sind ungültig: Der Tabellendeskriptor enthält doppelte Spalten“ fehl?
Meine Amazon Athena-Abfrage schlägt mit dem Fehler „HIVE_INVALID_METADATA: Hive-Metadaten für die Tabelle sample_table sind ungültig: Der Tabellendeskriptor enthält doppelte Spalten“ fehl.
Kurzbeschreibung
Dieser Fehler tritt auf, wenn das AWS Glue-Tabellenschema doppelte Spaltennamen oder Spalten mit demselben Namen wie Partitionsspalten enthält.
Behebung
Suchen Sie nach doppelten Spaltennamen
Um die doppelte Spalte zu identifizieren, führen Sie SHOW CREATE TABLE aus, um das Tabellenschema abzurufen. Oder sehen Sie sich das Tabellenschema in der AWS Glue-Konsole an. Im folgenden Beispiel gibt es zwei Spalten mit dem Namen „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' )
Um den Fehler zu beheben, führen Sie CREATE TABLE aus, um die Athena-Tabelle mit eindeutigen Spaltennamen neu zu erstellen. Verwenden Sie alternativ die AWS Glue-Konsole, um die doppelten Spalten umzubenennen:
- Öffnen Sie die AWS Glue-Konsole.
- Wählen Sie den Tabellennamen in der Liste und anschließend Schema bearbeiten aus.
- Wählen Sie den Spaltennamen aus, geben Sie einen neuen Namen ein und wählen Sie anschließend Speichern aus.
Suchen Sie nach Tabellenspalten und Partitionsspalten, die denselben Namen haben
Um nach doppelten Namen von Partitionsspalten und Tabellenspalten zu suchen, sehen Sie sich das Tabellenschema in der AWS Glue-Konsole an. Im folgenden Beispiel haben die Partitionsspalte und die Tabellenspalte beide den Namen „id“.
Beispieldaten:
{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" }
Tabellendefinition:
Name der Spalte | Datentyp | Partitionsschlüssel |
id | int | |
name | string | |
id | string | Partition (0) |
Nutzen Sie eine der folgenden Optionen, um das Problem zu lösen:
- Benennen Sie die Partitionsspalte im Amazon Simple Storage Service (Amazon S3)-Pfad um.
- Benennen Sie den Spaltennamen in den Daten und in der AWS Glue-Tabellendefinition um.
- Wenn es sich bei den Quelldaten um JSON handelt, verwenden Sie die Zuordnungsfunktion anstelle des AWS Glue-Crawlers, um die Tabelle manuell neu zu erstellen. Fügen Sie dann Partitionen in Athena hinzu. Im folgenden Beispiel verweist die AWS Glue-Tabelle auf s3://doc-example-bucket/athenajsontesting/, die die folgende Partitionsstruktur hat: s3://doc-example-bucket/athenajsontesting/id=12. Nachdem Sie die Tabelle erstellt haben, verwenden Sie MSCK REPAIR TABLE, um die Partition zu laden.
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')
Überprüfen Sie die JSON-Quelldaten auf doppelte Schlüssel
Wenn die JSON-Quelldaten Spaltennamen enthalten, die sich nur nach Groß- und Kleinschreibung unterscheiden (z. B. {"Username": "bob1234", "username": "bob" }), finden Sie weitere Informationen unter Warum erhalte ich Fehler, wenn ich versuche, JSON-Daten in Amazon Athena zu lesen? Athena unterscheidet standardmäßig nicht zwischen Groß- und Kleinschreibung. Athena behandelt „Username“ und „username“ als doppelte Schlüssel, es sei denn, Sie verwenden OpenX SerDe und setzen die Eigenschaft case.insensitive auf false.
Überprüfen der Parquet-Quelldaten auf doppelte Schlüssel
Wenn die Datenquelle im Parquet-Format ist und die Tabelle eine doppelte Spalte enthält, ändern Sie einen der Spaltennamen. Setzen Sie die SerDe-Eigenschaft parquet.column.index.access auf true. Parquet greift auf Spalten nach Namen und ORC nach Index zu.
Weitere Informationen finden Sie unter Umgang mit Schemaaktualisierungen.
Ähnliche Informationen
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Monaten
- AWS OFFICIALAktualisiert vor 10 Monaten