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?

Lesedauer: 3 Minute
0

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.

Lösung

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:

  1. Öffnen Sie die AWS Glue-Konsole.
  2. Wählen Sie den Tabellennamen in der Liste und anschließend Schema bearbeiten aus.
  3. 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 SpalteDatentypPartitionsschlüssel
idint
namestring
idstringPartition (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 die Quelldaten das JSON-Format haben handelt, erstellen Sie die Tabelle manuell neu und fügen Sie Partitionen in Athena hinzu, indem Sie die Mapping-Funktion nutzen, anstatt einen AWS Glue-Crawler zu verwenden. 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.


Ähnliche Informationen

JSON SerDe-Bibliotheken

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren