

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.

# Erstellen von Partitionsindizes
<a name="partition-indexes"></a>

Im Laufe der Zeit werden Hunderttausende von Partitionen zu einer Tabelle hinzugefügt. Die [GetPartitions API](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html) wird verwendet, um die Partitionen in der Tabelle abzurufen. Die API gibt Partitionen zurück, die mit dem Ausdruck in der Anforderung übereinstimmen.

Nehmen wir eine *sales\$1data*-Tabelle als Beispiel, die von den Schlüsseln *Country*, *Category*, *Year*, *Month* und *creationDate* partitioniert wird. Wenn Sie Verkaufsdaten für alle Artikel erhalten möchten, die in der Kategorie *Bücher* im Jahr 2020 nach *2020-08-15* verkauft wurden, müssen Sie eine `GetPartitions`-Anforderung mit dem Ausdruck "Category = 'Bücher' und creationDate > '2020-08-15'" im 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.

**Topics**
+ [Informationen zu Partitionsindizes](#partition-index-1)
+ [Erstellen einer Tabelle mit Partitionsindizes](#partition-index-creating-table)
+ [Hinzufügen eines Partitionsindexes zu einer vorhandenen Tabelle](#partition-index-existing-table)
+ [Beschreiben von Partitionsindizes in einer Tabelle](#partition-index-describing)
+ [Einschränkungen bei der Verwendung von Partitionsindizes](#partition-index-limitations)
+ [Verwenden von Indizes für einen optimierten Anruf GetPartitions](#partition-index-getpartitions)
+ [Integration mit Engines](#partition-index-integration-engines)

## Informationen zu Partitionsindizes
<a name="partition-index-1"></a>

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 *sales\$1data*-Tabelle lauten die möglichen Indizes (country, category, creationDate), (country, category, year), (country, category), (country), (category, country, year, month) usw.

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 Zeichenfolge (string, char und varchar), Numerisch (int, bigint, long, tinyint und smallint) und Datum (jjjj-MM-tt) erstellt werden. 

**Unterstützte Datentypen**
+ Datum – Ein Datum im ISO-Format, z. B. `YYYY-MM-DD`. Beispiel: Datum `2020-08-15`. Das Format verwendet Bindestriche (‐) zur Trennung von Jahr, Monat und Tag. Der zulässige Bereich für Datumsangaben für die Indizierung reicht von `0000-01-01` bis `9999-12-31`.
+ Zeichenfolge – Ein Zeichenfolgenliteral, das in einfache oder doppelte Anführungszeichen eingeschlossen ist. 
+ Char – Zeichendaten mit fester Länge, die zwischen 1 und 255 Zeichen liegen muss, z. B char(10).
+ Varchar – Zeichendaten mit variabler Länge, die zwischen 1 und 65 535 Zeichen liegen muss, z. B varchar(10).
+ Numerisch – int, bigint, long, tinyint und smallint

Indizes für die Datentypen Numerisch, Zeichenfolge und Datum unterstützen =, >, >=, <, <= und between-Operatoren. Die Indexierungslösung unterstützt derzeit nur den logischen Operator `AND`. Subausdrücke mit den Operatoren „LIKE“, „IN“, „OR“ und „NOT“ werden im Ausdruck zum Filtern mit einem Index ignoriert. 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\$1n“ 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](https://aws.amazon.com/glue/pricing/).

## Erstellen einer Tabelle mit Partitionsindizes
<a name="partition-index-creating-table"></a>

Sie können einen Partitionsindex während der Tabellenerstellung erstellen. Die `CreateTable`-Anforderung nimmt eine Liste von [`PartitionIndex`-Objekten](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-PartitionIndex) 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 der [`GetPartitionIndexes`-API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-GetPartitionIndexes) abgerufen werden

## Hinzufügen eines Partitionsindexes zu einer vorhandenen Tabelle
<a name="partition-index-existing-table"></a>

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 CREATING gesetzt und die Erstellung der Indexdaten wird gestartet. Wenn der Prozess zum Erstellen der Indizes erfolgreich ist, wird der indexStatus auf ACTIVE aktualisiert, und für einen nicht erfolgreichen 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\$1PARTITION\$1ERROR – Die Indexerstellung für eine Tabelle mit verschlüsselten Partitionen wird nicht unterstützt.
+ INVALID\$1PARTITION\$1TYPE\$1DATA\$1ERROR – 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\$1PARTITION\$1VALUE\$1ERROR – Tritt auf, wenn der `partitionValue` für einen `indexedKey` nicht vorhanden ist. Dies kann passieren, wenn eine Tabelle nicht konsistent partitioniert wird.
+ UNSUPPORTED\$1PARTITION\$1CHARACTER\$1ERROR – Wird beobachtet, wenn der Wert für einen indizierten Partitionsschlüssel die Zeichen \$1u0000, \$1u0001 oder \$1u0002 enthält
+ INTERNAL\$1ERROR – Beim Erstellen von Indizes ist ein interner Fehler aufgetreten. 

## Beschreiben von Partitionsindizes in einer Tabelle
<a name="partition-index-describing"></a>

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 Zustand kann mit der `DeletePartitionIndex`-Anforderung gelöscht werden, die den Status von AKTIV zu LÖSCHEN ändert.
+ `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:
+ ERSTELLEN → AKTIV → LÖSCHEN
+ ERSTELLEN → FEHLGESCHLAGEN

## Einschränkungen bei der Verwendung von Partitionsindizes
<a name="partition-index-limitations"></a>

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

**Neue Partitionserstellung (nach Hinzufügen des Index)**  
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. Das Erstellen einer neuen Partition mit dem Wert JAHR als „foo“ schlägt für die *sales\$1data*-Tabelle fehl, wenn ein Index für die Schlüssel (Kategorie, Jahr) erstellt wird, wobei die Kategorie vom Typ `string` und Jahr vom Typ `int` ist.

Nachdem Indizes aktiviert sind, schlägt das Hinzufügen von Partitionen mit indizierten Schlüsselwerten mit den Zeichen U\$10000, U\$100001 und U\$10002 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
<a name="partition-index-getpartitions"></a>

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\$1data*-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 | Verwendung des Index | 
| --- | --- | 
|  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' UND Kategorie = 'Schuhe' ODER Jahr > '2018'  |  Indizes werden nicht verwendet, da ein `OR`-Operator im Ausdruck vorhanden ist.  | 
|  Land = 'USA' UND Kategorie = 'Schuhe' UND (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 ist ('USA', 'GB') UND Kategorie = 'Schuhe'  |  Indizes werden nicht zum Filtern verwendet, da der `IN`-Operator derzeit nicht unterstützt wird.  | 
|  Land = 'USA' UND Kategorie in ('Schuhe', 'Bücher')  |  Index wird verwendet, um alle Partitionen mit Land = "USA" abzurufen, und dann wird eine Filterung nach dem Kategorieausdruck durchgeführt.  | 
|  Country = 'USA' UND Category in ('Schuhe', 'Bücher') UND (creationDate > '2023-9-01')  |  Index wird verwendet, um alle Partitionen mit country = "USA" mit creationDate > '2023-9-01' abzurufen, und dann wird eine Filterung nach dem Kategorieausdruck durchgeführt.  | 

## Integration mit Engines
<a name="partition-index-integration-engines"></a>

Redshift Spectrum, Amazon EMR und AWS Glue ETL Spark DataFrames können Indizes zum Abrufen von Partitionen verwenden, nachdem sich die Indizes im Status AKTIV befinden. AWS Glue [Athena](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index) und [AWS GlueETL Dynamic Frames](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates) erfordern das Ausführen zusätzlicher Schritte, um Indizes zur Verbesserung der Abfragen zu verwenden.

### Aktivieren der Partitionsfilterung
<a name="enable-partition-filtering-athena"></a>

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.**

1. Wählen Sie eine -Tabelle aus.

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

1. Fügen Sie unter **Tabelleneigenschaften** Folgendes hinzu:
   + Schlüssel — `partition_filtering.enabled`
   + Wert — `true`

1. Wählen Sie **Anwenden** aus.

Alternativ können Sie diesen Parameter festlegen, indem Sie eine [ALTER TABLE SET PROPERTIES](https://docs.aws.amazon.com/athena/latest/ug/alter-table-set-tblproperties.html)-Abfrage in Athena ausführen.

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