Partitionsindizes erstellen - AWS Glue

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Partitionsindizes erstellen

Im Laufe der Zeit werden Hunderttausende von Partitionen zu einer Tabelle hinzugefügt. Der GetPartitions APIwird verwendet, um die Partitionen in der Tabelle abzurufen. Das API gibt Partitionen zurück, die dem in der Anfrage angegebenen Ausdruck entsprechen.

Nehmen wir als Beispiel eine sales_data-Tabelle, die nach den Schlüsseln Country, Category, Year, Month und partitioniert ist. creationDate Wenn Sie Verkaufsdaten für alle Artikel abrufen möchten, die im Jahr 2020 nach dem 15.08.2020 für die Kategorie Bücher verkauft wurden, müssen Sie eine GetPartitions Anfrage mit dem Ausdruck „Kategorie = 'Bücher' und creationDate > '2020-08-15'“ an den Datenkatalog stellen.

Wenn keine Partitionsindizes in der Tabelle vorhanden sind, lädt AWS Glue alle Partitionen der Tabelle und filtert dann die geladenen Partitionen mithilfe des Abfrageausdrucks, der vom Benutzer in der GetPartitions-Anforderung bereitgestellt wird. Die Ausführung der Abfrage nimmt mehr Zeit in Anspruch, wenn die Anzahl der Partitionen in einer Tabelle ohne Indizes zunimmt. Mit einem Index versucht die GetPartitions-Abfrage eine Teilmenge der Partitionen abzurufen, statt alle Partitionen in der Tabelle zu laden.

Informationen zu Partitionsindizes

Wenn Sie einen Partitionsindex erstellen, geben Sie eine Liste der Partitionsschlüssel an, die bereits in einer bestimmten Tabelle vorhanden sind. Partitionsindex ist eine untergeordnete Liste der Partitionsschlüssel, die in der Tabelle definiert sind. Ein Partitionsindex kann auf jeder Permutation von Partitionsschlüsseln erstellt werden, die in der Tabelle definiert sind. Für die obige Tabelle sales_data sind die möglichen Indizes (Land, Kategorie,creationDate), (Land, Kategorie, Jahr), (Land, Kategorie), (Land), (Kategorie, Land, Jahr, Monat) usw. möglich.

Der Data Catalog verkettet die Partitionswerte in der Reihenfolge, die zum Zeitpunkt der Indexerstellung angegeben wurde. Der Index wird konsistent erstellt, wenn Partitionen zur Tabelle hinzugefügt werden. Indizes können für die Spaltentypen String (string, char und varchar), Numeric (int, bigint, long, tinyint und smallint) und Date (yyyy-MM-DD) erstellt werden.

Unterstützte Datentypen

  • Datum — Ein Datum im ISO Format, z. YYYY-MM-DD B. Zum Beispiel Datum2020-08-15. Das Format verwendet Bindestriche (‐), um Jahr, Monat und Tag zu trennen. Der zulässige Bereich für Datumsangaben für die Indizierung reicht von bis. 0000-01-01 9999-12-31

  • Zeichenfolge — Ein Zeichenfolgenliteral, das in einfache oder doppelte Anführungszeichen eingeschlossen ist.

  • Char — Zeichendaten mit fester Länge und einer angegebenen Länge zwischen 1 und 255, z. B. char (10).

  • Varchar — Zeichendaten mit variabler Länge und einer angegebenen Länge zwischen 1 und 65535, z. B. varchar (10).

  • Numerisch — int, bigint, long, tinyint und smallint

Indizes für die Datentypen Numeric, String und Date unterstützen die Operatoren =, >, >=, <, <= und zwischen. Die Indexierungslösung unterstützt derzeit nur den logischen Operator AND. Unterausdrücke mit den Operatoren "LIKE„, „IN“, „OR“ und "NOT" werden im Ausdruck ignoriert, wenn ein Index verwendet wird. Die Filterung für den ignorierten Subausdruck erfolgt auf den Partitionen, die nach dem Anwenden der Indexfilterung abgerufen werden.

Für jede Partition, die einer Tabelle hinzugefügt wird, wird ein entsprechendes Indexelement erstellt. Für eine Tabelle mit 'n'-Partitionen führt 1 Partitionsindex zu 'n' Partitionsindex-Elementen. Der Partitionsindex „m“ in derselben Tabelle führt zu „m*n“ Partitionsindex-Elementen. Jedes Partitionsindexelement wird entsprechend der aktuellen AWS Glue-Preisrichtlinie für Data-Catalog-Speicher abgerechnet. Weitere Informationen zur Preisgestaltung von Speicherobjekten finden Sie unter AWS Glue-Preise.

Erstellen einer Tabelle mit Partitionsindizes

Sie können einen Partitionsindex während der Tabellenerstellung erstellen. Die CreateTable-Anforderung nimmt eine Liste von PartitionIndex-Objekten als Eingabe. Für eine bestimmte Tabelle können maximal 3 Partitionsindizes erstellt werden. Jeder Partitionsindex erfordert einen Namen und eine Liste von partitionKeys, die für die Tabelle definiert ist. Erstellte Indizes für eine Tabelle können mit dem abgerufen werden GetPartitionIndexesAPI

Hinzufügen eines Partitionsindexes zu einer vorhandenen Tabelle

Um einen Partitionsindex einer vorhandenen Tabelle hinzuzufügen, verwenden Sie die CreatePartitionIndex-Operation. Sie können einen PartitionIndex pro CreatePartitionIndex-Operation erstellen. Das Hinzufügen eines Index wirkt sich nicht auf die Verfügbarkeit einer Tabelle aus, da die Tabelle während der Erstellung von Indizes weiterhin verfügbar ist.

Der Indexstatus für eine hinzugefügte Partition wird auf gesetzt CREATING und die Erstellung der Indexdaten wird gestartet. Wenn der Prozess zum Erstellen der Indizes erfolgreich ist, wird der indexStatus auf aktualisiert, ACTIVE und bei einem erfolglosen Prozess wird der Indexstatus auf FAILED aktualisiert. Die Indexerstellung kann aus mehreren Gründen fehlschlagen, und Sie können die GetPartitionIndexes-Operation verwenden, um die Fehlerdetails abzurufen. Mögliche Fehler:

  • ENCRYPTED_ PARTITION _ ERROR — Die Indexerstellung für eine Tabelle mit verschlüsselten Partitionen wird nicht unterstützt.

  • INVALID_ PARTITION _ TYPE _ DATA _ ERROR — Wird beobachtet, wenn der partitionKey Wert kein gültiger Wert für den entsprechenden partitionKey Datentyp ist. Beispiel: ein partitionKey mit dem Datentyp 'int' hat einen Wert 'foo'.

  • MISSING_ PARTITION _ VALUE _ ERROR — Wird beobachtet, wenn der partitionValue Wert für an nicht vorhanden indexedKey ist. Dies kann passieren, wenn eine Tabelle nicht konsistent partitioniert wird.

  • UNSUPPORTED_ PARTITION _ CHARACTER _ ERROR — Wird beobachtet, wenn der Wert für einen indizierten Partitionsschlüssel die Zeichen\ u0000,\ u0001 oder\ u0002 enthält

  • INTERNAL_ ERROR — Bei der Erstellung von Indizes ist ein interner Fehler aufgetreten.

Beschreiben von Partitionsindizes in einer Tabelle

Verwenden Sie die GetPartitionIndexes-Operation, um die für eine Tabelle erstellten Partitionsindizes abzurufen. Die Antwort zeigt alle Indizes der Tabelle, zusammen mit deren jeweiligem aktuellen Status (dem IndexStatus).

Der IndexStatus für einen Partitionsindex ist einer der Folgenden:

  • CREATING – Der Index wird derzeit erstellt und ist noch nicht verfügbar.

  • ACTIVE – Der Index ist jetzt verfügbar. Anforderungen können den Index verwenden, um eine optimierte Abfrage auszuführen.

  • DELETING – Der Index wird derzeit gelöscht und kann nicht länger verwendet werden. Ein Index im aktiven Status kann mithilfe der DeletePartitionIndex Anfrage gelöscht werden, wodurch der Status von ACTIVE zu DELETING verschoben wird.

  • FAILED – Die Indexerstellung für eine vorhandene Tabelle ist fehlgeschlagen. In jeder Tabelle werden die letzten 10 fehlgeschlagenen Indizes gespeichert.

Die möglichen Zustandsübergänge für Indizes, die für eine vorhandene Tabelle erstellt wurden, sind:

  • CREATING → ACTIVE → DELETING

  • CREATING → FAILED

Einschränkungen bei der Verwendung von Partitionsindizes

Nachdem Sie einen Partitionsindex erstellt haben, beachten Sie die folgenden Änderungen an der Tabellen- und Partitionsfunktionalität:

Erstellung einer neuen Partition (nach dem Hinzufügen des Indexes)

Nachdem ein Partitionsindex für eine Tabelle erstellt wurde, werden alle neuen Partitionen, die der Tabelle hinzugefügt wurden, für die Datentypüberprüfungen für indizierte Schlüssel validiert. Der Partitionswert der indizierten Schlüssel wird für das Datentypformat validiert. Wenn die Datentypprüfung fehlschlägt, schlägt der Vorgang zum Erstellen der Partition fehl. Wenn für die Tabelle sales_data ein Index für Schlüssel (Kategorie, Jahr) erstellt wird, bei denen die Kategorie vom Typ Typ string und Jahr istint, schlägt die Erstellung der neuen Partition mit dem Wert „foo“ fehl. YEAR

Nachdem Indizes aktiviert sind, schlägt das Hinzufügen von Partitionen mit indizierten Schlüsselwerten mit den Zeichen U+0000, U+00001 und U+0002 fehl.

Tabellenaktualisierungen

Sobald ein Partitionsindex für eine Tabelle erstellt wurde, können Sie die Partitionsschlüsselnamen für vorhandene Partitionsschlüssel nicht ändern. Das gleiche gilt für den Typ oder die Reihenfolge der Schlüssel, die mit dem Index registriert sind.

Verwenden von Indizes für einen optimierten Anruf GetPartitions

Wenn Sie GetPartitions für eine Tabelle mit einem Index verwenden, können Sie einen Ausdruck einschließen, und wenn möglich, verwendet der Data Catalog einen Index. Der erste Schlüssel des Indexes sollte im Ausdruck für die Indizes übergeben werden, die beim Filtern verwendet werden sollen. Die Indexoptimierung in der Filterung wird als Best Effort angewendet. Der Data Catalog versucht, die Indexoptimierung so weit wie möglich zu verwenden, aber im Falle eines fehlenden Index oder nicht unterstützten Operators fällt er auf die vorhandene Implementierung des Ladens aller Partitionen zurück.

Fügen wir für die sales_data-Tabelle oben den Index [Land, Kategorie, Jahr] hinzu. Wenn „Country“ im Ausdruck nicht übergeben wird, kann der registrierte Index keine Partitionen mithilfe von Indizes filtern. Sie können bis zu 3 Indizes hinzufügen, um verschiedene Abfragemuster zu unterstützen.

Nehmen wir einige Beispielausdrücke und sehen, wie Indizes darauf funktionieren:

Ausdrücke Wie wird der Index verwendet

Land = „USA“

Index wird verwendet, um Partitionen zu filtern.

Land = 'USA' und Kategorie = 'Schuhe'

Index wird verwendet, um Partitionen zu filtern.

Kategorie = 'Schuhe'

Indizes werden nicht verwendet, da „Land“ nicht im Ausdruck angegeben wird. Alle Partitionen werden geladen, um eine Antwort zurückzugeben.

Land = 'USA' und Kategorie = 'Schuhe' und Jahr > '2018'

Index wird verwendet, um Partitionen zu filtern.

Land = 'USA' und Kategorie = 'Schuhe' und Jahr > '2018' und Monat = 2

Index wird verwendet, um alle Partitionen abzurufen; Land = „USA“ und Kategorie = „Schuhe“ und Jahr > 2018. Anschließend wird nach dem Ausdruck 'Monat' gefiltert.

Land = 'USA' AND Kategorie = 'Schuhe' ODER Jahr > '2018'

Indizes werden nicht verwendet, da ein OR-Operator im Ausdruck vorhanden ist.

Land = 'USA' AND Kategorie = 'Schuhe' AND (Jahr = 2017 ODER Jahr = '2018')

Index wird verwendet, um alle Partitionen mit Land = 'USA' und Kategorie = 'Schuhe' abzurufen. Anschließend wird nach dem Ausdruck 'Jahr' gefiltert.

Land in der AND Kategorie („USA“, „Großbritannien“) = „Schuhe“

Indizes werden nicht zum Filtern verwendet, da der IN-Operator derzeit nicht unterstützt wird.

Land = AND Kategorie „USA“ in („Schuhe“, „Bücher“)

Index wird verwendet, um alle Partitionen mit Land = "USA" abzurufen, und dann wird eine Filterung nach dem Kategorieausdruck durchgeführt.

Land = 'USA', AND Kategorie in ('Schuhe', 'Bücher') AND (creationDate > '2023-9-01'

Der Index wird verwendet, um alle Partitionen mit country = „US“ und mit creationDate > '2023-9-01' abzurufen. Anschließend wird nach dem Kategorieausdruck gefiltert.

Integration mit Engines

Redshift Spectrum, Amazon EMR und AWS Glue ETL Spark DataFrames sind in der Lage, Indizes zum Abrufen von Partitionen zu verwenden, nachdem sich die Indizes in einem Status in befinden. ACTIVE AWS Glue Bei Athena und AWS GlueETLDynamic Frames müssen Sie zusätzliche Schritte ausführen, um Indizes zur Verbesserung von Abfragen zu verwenden.

Aktivieren Sie die Partitionsfilterung

Um die Partitionsfilterung in Athena zu aktivieren, müssen Sie die Tabelleneigenschaften wie folgt aktualisieren:

  1. Wählen Sie in der AWS Glue Konsole unter Datenkatalog die Option Tabellen aus.

  2. Wählen Sie eine -Tabelle aus.

  3. Wählen Sie unter Aktionen die Option Tabelle bearbeiten aus.

  4. Fügen Sie unter Tabelleneigenschaften Folgendes hinzu:

    • Schlüssel — partition_filtering.enabled

    • Wert — true

  5. Wählen Sie Apply (Anwenden) aus.

Alternativ können Sie diesen Parameter festlegen, indem Sie eine ALTERTABLESETPROPERTIESAbfrage in Athena ausführen.

ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')