Schema-Updates verarbeiten - Amazon Athena

Schema-Updates verarbeiten

In diesem Abschnitt finden Sie Anleitungen zum Umgang mit Schema-Updates für verschiedene Datenformate. Athena ist eine Schema-on-Read-Abfrage-Engine. Dies bedeutet, dass beim Anlegen einer Tabelle in Athena Schemata beim Lesen der Daten angewendet werden. Dabei werden die zugrunde liegenden Daten nicht geändert oder überschrieben.

Wenn Sie Änderungen in Tabellenschemata vorweg nehmen, sollten Sie diese in einem für Ihre Bedürfnisse geeigneten Datenformat anlegen. Ihr Ziel ist es, vorhandene Athena-Abfragen bei sich weiterentwickelnden Schemata wiederzuverwenden und beim Abfragen von Tabellen mit Partitionen Fehler aufgrund von Schemakonflikten zu vermeiden.

Um diese Ziele zu erreichen, wählen Sie das Datenformat basierend auf der Tabelle im folgenden Thema.

Unterstützte Schemaaktualisierungs-Operationen nach Datenformat

Die folgende Tabelle enthält eine Übersicht über die Datenspeicherungsformate und ihre unterstützten Schema-Manipulationen. Verwenden Sie diese Tabelle, um das Format zu wählen, mit dem Sie weiterhin Athena-Abfragen verwenden können, auch wenn sich Ihre Schemata im Lauf der Zeit ändern.

Beachten Sie, dass Parquet und ORC in dieser Tabelle Spaltenformate mit unterschiedlichen Standard-Spaltenzugriffsmethoden sind. Standardmäßig greift Parquet dem Namen nach auf Spalten zu, ORC dem Index nach (Ordnungswert). Aus diesem Grund stellt Athena eine SerDe-Eigenschaft bereit, die definiert wird, wenn eine Tabelle erstellt wird, um die Standard-Spaltenzugriffsmethode umzustellen. Dies ermöglicht eine größere Flexibilität bei der Schema-Entwicklung.

Für Parquet kann die parquet.column.index.access-Eigenschaft auf true gesetzt werden, sodass die Spaltenzugriffsmethode die Ordinalzahl für die Spalte verwendet. Wenn Sie diese Eigenschaft auf false setzen, ändert sich die Spaltenzugriffsmethode auf die Verwendung des Spaltennamens. Analog dazu verwenden Sie für ORC die orc.column.index.access -Eigenschaft, um die Spaltenzugriffsmethode festzulegen. Weitere Informationen finden Sie unter Indexzugriff für Apache ORC und Apache Parquet verstehen.

Mit CSV und TSV können Sie alle Schema-Manipulationen durchführen, mit Ausnahme der Neuanordnung von Spalten oder des Hinzufügens von Spalten am Anfang der Tabelle. Wenn Ihre Schemaentwicklung z. B. nur das Umbenennen von Spalten, nicht aber deren Entfernung erfordert, können Sie Ihre Tabellen in CSV oder TSV erstellen. Wenn Sie Spalten entfernen möchten, verwenden Sie nicht CSV oder TSV, sondern eines der anderen unterstützten Formate, vorzugsweise ein Spaltenformat wie Parquet oder ORC.

Schema-Updates und Datenformate in Athena
Erwarteter Typ des Schema-Updates Übersicht CSV (mit und ohne Header) und TSV JSON AVRO PARQUET: Lesen nach Namen (Standard) PARQUET: Lesen nach Index ORC: Lesen nach Index (Standard) ORC: Lesen nach Namen
Spalten umbenennen Speichern Sie Ihre Daten in CSV und TSV oder in ORC und Parquet, wenn sie nach dem Index gelesen werden. Y N N N Y Y N
Hinzufügen von Spalten am Anfang oder in der Mitte der Tabelle Speichern Sie Ihre Daten in JSON, AVRO oder in Parquet und ORC, wenn sie nach dem Namen gelesen werden. Verwenden Sie nicht CSV und TSV. N Y Y Y N N Y
Hinzufügen von Spalten am Ende der Tabelle Speichern Sie Ihre Daten im CSV-, TSV-, JSON-, AVRO-, ORC- oder Parquet-Format. Y Y Y Y Y Y Y
Spalten entfernen Speichern Sie Ihre Daten in JSON, AVRO oder in Parquet und ORC, wenn sie nach dem Namen gelesen werden. Verwenden Sie nicht CSV und TSV. N Y Y Y N N Y
Neuanordnen von Spalten Speichern Sie Ihre Daten in AVRO, JSON oder ORC und Parquet, wenn sie nach dem Namen gelesen werden. N Y Y Y N N Y
Ändern des Datentyps einer Spalte Speichern Sie Ihre Daten in einem beliebigen Format, testen Sie Ihre Abfrage jedoch in Athena, um sicherzustellen, dass die Datentypen kompatibel sind. Für Parquet und ORC ist eine Änderung des Datentyps nur für partitionierte Tabellen möglich. Y Y Y Y Y Y Y

Indexzugriff für Apache ORC und Apache Parquet verstehen

PARQUET und ORC sind spaltenbasierte Dateiformaten, die nach Index gelesen werden können, oder nach Namen. Wenn Sie Ihre Daten in einem dieser Formate speichern, können Sie alle Operationen an Schemata durchführen und Athena-Abfragen ohne Schema-Fehler ausführen.

  • Athena liest ORC standardmäßig nach dem Index, wie in SERDEPROPERTIES ( 'orc.column.index.access'='true') definiert. Weitere Informationen finden Sie unter ORC: Lesen nach Index.

  • Athena liest Parquet standardmäßig nach dem Namen, wie in SERDEPROPERTIES ( 'parquet.column.index.access'='false') definiert. Weitere Informationen finden Sie unter Parquet: Lesen nach Namen.

Da dies die Standardoptionen sind, ist die Angabe dieser SerDe-Eigenschaften in Ihren CREATE TABLE-Abfragen optional, weil sie implizit verwendet werden. Wenn sie verwendet werden, gestatten sie Ihnen die Ausführung einiger Schema-Update-Operationen, während sie andere solcher Operationen verhindern. Um diese Operationen zu aktivieren, führen Sie eine weitere CREATE TABLE-Anfrage aus und ändern die SerDe-Einstellungen.

Anmerkung

Die SerDe-Eigenschaften werden nicht automatisch für jede Partition weitergegeben. Verwenden Sie ALTER TABLE ADD PARTITION-Anweisungen zum Festlegen der SerDe-Eigenschaften für jede Partition. Um diesen Prozess zu automatisieren, schreiben Sie ein Skript, das ALTER TABLE ADD PARTITION-Anweisungen ausführt.

In den folgenden Abschnitten werden diese Fälle ausführlich beschrieben.

ORC: Lesen nach Index

Eine Tabelle wird in ORC standardmäßig nach dem Index gelesen. Dies wird durch die folgende Syntax definiert:

WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')

Lesen nach Index erlaubt, die Spalten umzubenennen. Sie verlieren damit jedoch die Möglichkeit, Spalten zu entfernen oder in der Mitte der Tabelle hinzuzufügen.

Damit ORC nach dem Namen liest, sodass Sie Spalten in der Mitte der Tabelle hinzufügen oder entfernen können, setzhen Sie die SerDe-Eigenschaft orc.column.index.access in der false-Anweisung auf CREATE TABLE. In dieser Konfiguration verlieren Sie die Möglichkeit, Spalten umzubenennen.

Anmerkung

Wenn in Athena-Engine-Version 2 ORC-Tabellen so eingestellt sind, dass sie nach Namen lesen, erfordert Athena, dass alle Spaltennamen in den ORC-Dateien in Kleinbuchstaben sind. Da Apache Spark beim Generieren von ORC-Dateien keine Feldnamen in Kleinbuchstaben enthält, kann Athena die so generierten Daten möglicherweise nicht lesen. Die Abhilfe besteht darin, die Spalten in Kleinbuchstaben umzubenennen oder Athena-Engine-Version 3 zu verwenden.

Das folgende Beispiel zeigt, wie Sie die ORC abändern, um nach Namen zu lesen:

CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH SERDEPROPERTIES ( 'orc.column.index.access'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';

Parquet: Lesen nach Namen

Eine Tabelle wird in Parquet standardmäßig nach dem Namen gelesen. Dies wird durch die folgende Syntax definiert:

WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')

Lesen nach Namen ermöglicht Ihnen das Hinzufügen von Spalten in der Mitte der Tabelle und das Entfernen von Spalten. Aber dann verlieren Sie die Möglichkeit, Spalten umzubenennen.

Um Parquet umzustellen, sodass es nach dem Index liest und Sie Spalten umbenennen können, müssen Sie eine Tabelle erstellen, deren SerDe-Eigenschaft parquet.column.index.access auf true gesetzt ist.