

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.

# Partitionsprojektion mit Amazon Athena verwenden
<a name="partition-projection"></a>

Sie können die Partitionsprojektion in Athena verwenden, um die Abfrageverarbeitung von hochpartitionierten Tabellen zu beschleunigen und die Partitionsverwaltung zu automatisieren.

Bei der Partitionsprojektion berechnet Athena Partitionswerte und Speicherorte aus Tabelleneigenschaften, die Sie direkt in Ihrer Tabelle in AWS Glue konfigurieren. Die Tabelleneigenschaften ermöglichen es Athena, die erforderlichen Partitionsinformationen zu „projizieren“ oder zu ermitteln, anstatt eine zeitaufwändigere Suche nach Metadaten in AWS Glue Data Catalog durchführen zu müssen. Da In-Memory-Operationen oft schneller sind als Remote-Operationen, kann die Partitionsprojektion die Laufzeit von Abfragen für hochpartitionierte Tabellen reduzieren. Je nach den spezifischen Merkmalen der Abfrage und den zugrunde liegenden Daten kann die Partitionsprojektion die Abfragelaufzeit für Abfragen, die auf den Abruf von Partitionsmetadaten beschränkt sind, erheblich verkürzen.

## Grundlegendes über Partitionsbereinigung im Vergleich zu Partitionsprojektion
<a name="partition-projection-pruning-vs-projection"></a>

Die Partitionsbeschneidung erfasst Metadaten und „beschneidet“ sie nur für die Partitionen, die für Ihre Abfrage gelten. Dies beschleunigt häufig Abfragen. Athena verwendet die Partitionsbeschneidung für alle Tabellen mit Partitionsspalten, einschließlich der Tabellen, die für die Partitionsprojektion konfiguriert sind.

Normalerweise `GetPartitions` ruft Athena bei der Verarbeitung von Abfragen den auf, AWS Glue Data Catalog bevor die Partition bereinigt wird. Wenn eine Tabelle über eine große Anzahl von Partitionen verfügt, kann die Verwendung von `GetPartitions` die Leistung negativ beeinflussen. Um dies zu vermeiden, können Sie die Partitionsprojektion verwenden. Die Partitionsprojektion ermöglicht es Athena, Aufrufe von `GetPartitions` zu vermeiden, da die Partitionsprojektionskonfiguration Athena alle notwendigen Informationen gibt, um die Partitionen selbst zu erstellen.

## So verwenden Sie Partitionsprojektion
<a name="partition-projection-using"></a>

Um die Partitionsprojektion zu verwenden, geben Sie die Bereiche der Partitionswerte und Projektionstypen für jede Partitionsspalte in den Tabelleneigenschaften im AWS Glue Data Catalog oder in Ihrem [externen Hive-Metastore](connect-to-data-source-hive.md) an. Diese benutzerdefinierten Eigenschaften in der Tabelle ermöglichen es Athena zu wissen, welche Partitionsmuster zu erwarten sind, wenn eine Abfrage für die Tabelle ausgeführt wird. Während der Abfrageausführung verwendet Athena diese Informationen, um die Partitionswerte zu projizieren, anstatt sie aus dem AWS Glue Data Catalog oder einem externen Hive-Metastore abzurufen. Dies reduziert nicht nur die Ausführungszeit der Abfrage, sondern automatisiert auch das Partitionsmanagement, da dadurch keine manuelle Erstellung von Partitionen in Athena, AWS Glue oder Ihrem externen Hive-Metastore erforderlich ist.

**Wichtig**  
Wenn Sie die Partitionsprojektion für eine Tabelle aktivieren, ignoriert Athena alle Partitionsmetadaten, die für die Tabelle im AWS Glue Data Catalog oder Hive-Metastore registriert sind.

## Einige Anwendungsfälle
<a name="partition-projection-use-cases"></a>

Szenarien, in denen Partitionsprojektion sinnvoll ist, sind die etwa folgenden:
+ Abfragen für eine hochpartitionierte Tabelle werden nicht so schnell abgeschlossen, wie Sie dies wünschen.
+ Sie fügen regelmäßig Partitionen zu Tabellen hinzu, wenn neue Datums- oder Zeitpartitionen in Ihren Daten erstellt werden. Mit der Partitionsprojektion konfigurieren Sie relative Datumsbereiche, die beim Eintreffen neuer Daten verwendet werden können. 
+ Sie haben stark partitionierte Daten in Amazon S3. Es ist nicht praktikabel, die Daten in Ihrem AWS Glue Data Catalog oder Hive-Metastore zu modellieren, und Ihre Abfragen lesen nur kleine Teile davon.

### Projizierbare Partitionsstrukturen
<a name="partition-projection-known-data-structures"></a>

Die Partitionsprojektion kann am einfachsten konfiguriert werden, wenn Ihre Partitionen einem vorhersehbaren Muster folgen, wie z. B.
+ **Ganzzahlen** – Jede fortlaufende Folge von ganzen Zahlen wie `[1, 2, 3, 4, ..., 1000]` oder `[0500, 0550, 0600, ..., 2500]`.
+ **Datumsangaben** – Jede fortlaufende Folge von Datumsangaben oder Datum/Uhrzeitangaben wie `[20200101, 20200102, ..., 20201231]` oder `[1-1-2020 00:00:00, 1-1-2020 01:00:00, ..., 12-31-2020 23:00:00]`.
+ **Aufzählungswerte** — Eine endliche Menge von Aufzählungswerten wie Flughafencodes oder. AWS-Regionen
+ **AWS-Service Logs** — AWS-Service Logs haben in der Regel eine bekannte Struktur, deren Partitionsschema Sie angeben können AWS Glue und die Athena daher für die Partitionsprojektion verwenden kann.

### So passen Sie die Partitionspfadvorlage an
<a name="partition-projection-custom-s3-storage-locations"></a>

Standardmäßig erstellt Athena Partitionsspeicherorte mithilfe des Formulars `s3://amzn-s3-demo-bucket/<table-root>/partition-col-1=<partition-col-1-val>/partition-col-2=<partition-col-2-val>/`, aber wenn Ihre Daten anders organisiert sind, bietet Athena einen Mechanismus zum Anpassen dieser Pfadvorlage. Informationen zu den erforderlichen Schritten finden Sie unter [So geben Sie benutzerdefinierte S3-Speicherorten an](partition-projection-setting-up.md#partition-projection-specifying-custom-s3-storage-locations).

## Überlegungen und Einschränkungen
<a name="partition-projection-considerations-and-limitations"></a>

Beachten Sie die folgenden Überlegungen:
+ Die Partitionsprojektion beseitigt die Notwendigkeit, Partitionen manuell in AWS Glue oder einem externen Hive-Metastore anzugeben.
+ Wenn Sie die Partitionsprojektion für eine Tabelle aktivieren, ignoriert Athena alle Partitionsmetadaten im AWS Glue Data Catalog oder externen Hive-Metastore für diese Tabelle.
+ Wenn eine projizierte Partition in Amazon S3 nicht vorhanden ist, projiziert Athena die Partition weiter aus. Athena löst keinen Fehler aus, aber es werden keine Daten zurückgegeben. Wenn jedoch zu viele Ihrer Partitionen leer sind, kann die Leistung im Vergleich zu herkömmlichen Partitionen langsamer sein. AWS Glue Wenn mehr als die Hälfte der projizierten Partitionen leer ist, wird empfohlen, herkömmliche Partitionen zu verwenden.
+ Abfragen für Werte, die außerhalb der für die Partitionsprojektion definierten Bereichsgrenzen liegen, geben keinen Fehler zurück. Stattdessen wird die Abfrage ausgeführt, gibt aber null Zeilen aus. Wenn Sie beispielsweise zeitbezogene Daten haben, die im Jahr 2020 beginnen und als `'projection.timestamp.range'='2020/01/01,NOW'` definiert sind, wird eine Abfrage wie `SELECT * FROM table-name WHERE timestamp = '2019/02/02'` erfolgreich abgeschlossen, aber Nullzeilen zurückgeben.
+ Die Partitionsprojektion ist nur verwendbar, wenn die Tabelle über Athena abgefragt wird. Wenn dieselbe Tabelle durch einen anderen Service wie Amazon Redshift Spectrum, Athena for Spark oder Amazon EMR gelesen wird, werden die Standard-Partitionsmetadaten verwendet.
+ Da es sich bei der Partitionsprojektion nur um eine DML-Funktion handelt, werden `SHOW PARTITIONS` keine Partitionen aufgeführt, die von Athena projiziert, aber nicht im AWS Glue Katalog oder im externen Hive-Metastore registriert sind. 
+ Athena verwendet die Tabelleneigenschaften von Ansichten nicht als Konfiguration für die Partitionsprojektion. Um diese Einschränkung zu umgehen, konfigurieren und aktivieren Sie die Partitionsprojektion in den Tabelleneigenschaften für die Tabellen, auf die die Ansichten verweisen.

## Video
<a name="partition-projection-video"></a>

Das folgende Video zeigt, wie Sie die Partitionsprojektion verwenden, um die Leistung Ihrer Abfragen in Athena zu verbessern.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/iUD5pPpcyZk/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/iUD5pPpcyZk)


**Topics**
+ [Grundlegendes über Partitionsbereinigung im Vergleich zu Partitionsprojektion](#partition-projection-pruning-vs-projection)
+ [So verwenden Sie Partitionsprojektion](#partition-projection-using)
+ [Einige Anwendungsfälle](#partition-projection-use-cases)
+ [Überlegungen und Einschränkungen](#partition-projection-considerations-and-limitations)
+ [Video](#partition-projection-video)
+ [Partitionsprojektions einrichten](partition-projection-setting-up.md)
+ [Unterstützte Typen für die Partitionsprojektion](partition-projection-supported-types.md)
+ [Dynamische ID-Partitionierung verwenden](partition-projection-dynamic-id-partitioning.md)
+ [Beispiel für Amazon Data Firehose](partition-projection-kinesis-firehose-example.md)

# Partitionsprojektions einrichten
<a name="partition-projection-setting-up"></a>

Das Einrichten der Partitionsprojektion in den Eigenschaften einer Tabelle ist ein zweistufiger Prozess:

1. Geben Sie die Datenbereiche und relevanten Muster für jede Partitionsspalte an oder verwenden Sie eine benutzerdefinierte Vorlage.

1. Aktivieren Sie die Partitionsprojektion für die Tabelle.

**Anmerkung**  
Bevor Sie einer vorhandenen Tabelle Partitionsprojektionseigenschaften hinzufügen, muss die Partitionsspalte, für die Sie Partitionsprojektionseigenschaften einrichten, bereits im Tabellenschema vorhanden sein. Wenn die Partitionsspalte noch nicht existiert, müssen Sie der vorhandenen Tabelle manuell eine Partitionsspalte hinzufügen. AWS Glue führt diesen Schritt nicht automatisch für Sie aus. 

In diesem Abschnitt wird gezeigt, wie Sie die Tabelleneigenschaften für festlegen AWS Glue. Um sie festzulegen, können Sie die AWS Glue Konsole, [CREATE TABLE](create-table.md) Athena-Abfragen oder [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)Operationen verwenden. Das folgende Verfahren zeigt, wie die Eigenschaften in der AWS Glue Konsole festgelegt werden.

**So konfigurieren und aktivieren Sie die Partitionsprojektion mit der AWS Glue Konsole**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die AWS Glue Konsole unter [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/).

1. Wählen Sie die Registerkarte **Tables** (Tabellen).

   Auf der Registerkarte **Tables** (Tabellen) können Sie vorhandene Tabellen bearbeiten oder mit **Add tables** (Tabellen hinzufügen) neue Tabellen erstellen. Informationen zum manuellen Hinzufügen von Tabellen oder zur Verwendung eines Crawlers dafür finden Sie unter [Arbeiten mit Tabellen in der AWS Glue -Konsole](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html) im *AWS Glue -Entwicklerhandbuch*.

1. Wählen Sie in der Liste der Tabellen den Link für die Tabelle aus, die Sie bearbeiten möchten.  
![\[Wählen Sie in der AWS Glue Konsole eine Tabelle aus, die Sie bearbeiten möchten.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/partition-projection-1.png)

1. Wählen Sie **Actions** (Aktionen) und **Edit table** (Tabelle bearbeiten) aus.

1. Fügen Sie auf der Seite **Edit table** (Tabelle bearbeiten) im Abschnitt **Table properties** (Tabelleneigenschaften) für jede partitionierte Spalte das folgende Schlüssel-Wert-Paar hinzu:

   1. Fügen Sie für **Key (Schlüssel)** `projection.columnName.type` hinzu.

   1. Fügen Sie für **Value (Wert)** einen der unterstützten Typen hinzu: `enum`, `integer`, `date` oder `injected`. Weitere Informationen finden Sie unter [Unterstützte Typen für die Partitionsprojektion](partition-projection-supported-types.md).

1. Fügen Sie nach den Anweisungen in [Unterstützte Typen für die Partitionsprojektion](partition-projection-supported-types.md) zusätzliche Schlüssel-Wert-Paare gemäß Ihren Konfigurationsanforderungen hinzu.

   In der folgenden Beispieltabellenkonfiguration wird die `year`-Spalte für die Partitionsprojektion konfiguriert, wobei die Werte, die zurückgegeben werden können, auf einen Bereich von 2010 bis 2016 beschränkt werden.  
![\[Konfigurieren der Partitionsprojektion für eine Partitionsspalte in den Eigenschaften der AWS Glue -Konsolentabelle.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/partition-projection-3.png)

1. Fügen Sie ein Schlüssel-Wert-Paar hinzu, um die Partitionsprojektion zu aktivieren. Geben Sie für **Key (Schlüssel)** den Wert `projection.enabled` und für dessen **Value (Wert)** `true` ein.
**Anmerkung**  
Sie können die Partitionsprojektion für diese Tabelle jederzeit deaktivieren, indem Sie `projection.enabled` auf `false` setzen.

1. Klicken Sie auf **Save **, sobald Sie fertig sind.

1. Prüfen Sie im Athena-Abfrage-Editor die Spalten, die Sie für die Tabelle konfiguriert haben.

   Die folgende Beispielabfrage verwendet `SELECT DISTINCT`, um die eindeutigen Werte aus der `year`-Spalte zurückzugeben. Die Datenbank enthält Daten von 1987 bis 2016, aber die `projection.year.range`-Eigenschaft beschränkt die zurückgegebenen Werte auf die Jahre 2010 bis 2016.  
![\[Abfragen einer Spalte, die die Partitionsprojektion verwendet.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/partition-projection-5.png)
**Anmerkung**  
Wenn Sie `projection.enabled` auf `true` festlegen, aber nicht mindestens eine Partitionsspalte konfigurieren, erhalten Sie eine Fehlermeldung wie die folgende:  
`HIVE_METASTORE_ERROR: Table database_name.table_name is configured for partition projection, but the following partition columns are missing projection configuration: [column_name] (table database_name.table_name)`.

## So geben Sie benutzerdefinierte S3-Speicherorten an
<a name="partition-projection-specifying-custom-s3-storage-locations"></a>

Wenn Sie Tabelleneigenschaften in bearbeiten AWS Glue, können Sie auch eine benutzerdefinierte Amazon S3 S3-Pfadvorlage für die projizierten Partitionen angeben. Eine benutzerdefinierte Vorlage ermöglicht Athena die ordnungsgemäße Zuweisung von Partitionswerten zu benutzerdefinierten Amazon-S3-Dateispeicherorten, die keinem typischen `.../column=value/...`-Muster folgen. 

Die Verwendung einer benutzerdefinierten Vorlage ist optional. Wenn Sie jedoch eine benutzerdefinierte Vorlage verwenden, muss die Vorlage einen Platzhalter für jede Partitionsspalte enthalten. Vorlagenspeicherorte müssen mit einem Schrägstrich enden, damit die partitionierten Datendateien pro Partition in einem „Ordner“ gespeichert werden.

**So geben Sie eine benutzerdefinierte Partitionsspeicherortvorlage an:**

1. Folgen Sie den Schritten zur [Konfiguration und Aktivierung der Partitionsprojektion mithilfe der AWS Glue Konsole](#partition-projection-setting-up-procedure) und fügen Sie ein zusätzliches Schlüssel-Wert-Paar hinzu, das eine benutzerdefinierte Vorlage wie folgt spezifiziert:

   1. Geben Sie für **Key (Schlüssel)** `storage.location.template` ein.

   1. Geben Sie für **Value (Wert)** einen Speicherort an, der für jede Partitionsspalte einen Platzhalter enthält. Stellen Sie sicher, dass jeder Platzhalter (und der S3-Pfad selbst) durch einen einzelnen Schrägstrich beendet wird.

      In den folgenden Beispielvorlagenwerten wird von einer Tabelle mit den Partitionsspalten `a`, `b` und `c` ausgegangen.

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/      
      ```

      ```
      s3://amzn-s3-demo-bucket/table_root/c=${c}/${b}/some_static_subdirectory/${a}/${b}/${c}/${c}/      
      ```

      Für dieselbe Tabelle ist der folgende Beispielvorlagenwert ungültig, da er keinen Platzhalter für die Spalte `c` enthält.

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/         
      ```

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

# Unterstützte Typen für die Partitionsprojektion
<a name="partition-projection-supported-types"></a>

Eine Tabelle kann eine beliebige Kombination aus den Partitionsspaltentypen `enum`, `integer`, `date,` oder `injected` aufweisen.

## Aufzählungstyp
<a name="partition-projection-enum-type"></a>

Verwenden Sie den `enum` Typ für Partitionsspalten, deren Werte Mitglieder einer Aufzählung sind (z. B. Flughafencodes oder). AWS-Regionen

Definieren Sie die Partitionseigenschaften in der Tabelle wie folgt:


****  

| Name der Eigenschaft | Beispielwerte | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `enum`  | Erforderlich Der Projektionstyp, der für Spalten verwendet werden soll. columnName Der Wert muss enum (ohne Beachtung der Groß- und Kleinschreibung) sein, um die Verwendung des Aufzählungstyps zu signalisieren. Vorangehende und nachfolgende Leerzeichen sind zulässig. | 
| projection.columnName.values |  `A,B,C,D,E,F,G,Unknown`  | Erforderlich Eine durch Kommas getrennte Liste von aufgezählten Partitionswerten für eine Spalte. columnName Jeder Leerraum wird als Teil eines Aufzählungswerts betrachtet. | 

**Anmerkung**  
Als bewährte Methode empfehlen wir, die Verwendung von `enum`-basierten Partitionsprojektionen auf einige Dutzend oder weniger zu beschränken. Es gibt zwar keine spezifische Obergrenze für `enum` Projektionen, aber die Gesamtgröße der Metadaten Ihrer Tabelle darf die AWS Glue Grenze von etwa 1 MB bei der GZIP-Komprimierung nicht überschreiten. Beachten Sie, dass dieses Limit für wichtige Teile Ihrer Tabelle wie Spaltennamen, Speicherort, Speicherformat und andere freigegeben wird. Wenn Sie feststellen, dass Sie IDs in Ihrer `enum` Projektion mehr als ein paar Dutzend eindeutige Werte verwenden, sollten Sie einen alternativen Ansatz in Betracht ziehen, z. B. das Aufteilen in einer kleineren Anzahl von Einzelwerten in einem Ersatzfeld. Durch den Handel mit Kardinalität können Sie die Anzahl der eindeutigen Werte in Ihrem `enum`-Feld steuern. 

## Ganzzahl-Typ
<a name="partition-projection-integer-type"></a>

Verwenden Sie den Ganzzahl-Typ für Partitionsspalten, deren mögliche Werte als Ganzzahlen innerhalb eines definierten Bereichs interpretierbar sind. Projizierte Ganzzahl-Spalten sind derzeit auf den Java Signed Long-Bereich (-263 bis 263-1 inklusive) begrenzt.


****  

| Name der Eigenschaft | Beispielwerte | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `integer`  | Erforderlich Der Projektionstyp, der für die Spalte verwendet werden soll. columnName Der Wert muss integer (ohne Beachtung der Groß- und Kleinschreibung) sein, um die Verwendung des Ganzzahl-Typs zu signalisieren. Vorangehende und nachfolgende Leerzeichen sind zulässig. | 
| projection.columnName.range |  `0,10` `-1,8675309` `0001,9999`  | Erforderlich Eine durch Kommas getrennte Liste mit zwei Elementen, die die minimalen und maximalen Bereichswerte enthält, die von Abfragen in der Spalte zurückgegeben werden sollen. columnName Beachten Sie, dass die Werte durch Kommata voneinander getrennt werden müssen, nicht durch einen Bindestrich. Diese Werte sind einschließlich, können negativ sein und können vorangehende Nullen aufweisen. Vorangehende und nachfolgende Leerzeichen sind zulässig. | 
| projection.columnName.interval |  `1` `5`  | Optional. Eine positive Ganzzahl, die das Intervall zwischen aufeinanderfolgenden Partitionswerten für die Spalte angibt. columnName Beispiel: Ein range-Wert von „1,3“ mit dem interval-Wert „1“ erzeugt die Werte 1, 2 und 3. Derselbe range-Wert mit dem interval-Wert „2" erzeugt die Werte 1 und 3, wobei 2 übersprungen wird. Vorangehende und nachfolgende Leerzeichen sind zulässig. Der Standardwert ist 1. | 
| projection.columnName.digits |  `1` `5`  | Optional. Eine positive Ganzzahl, die die Anzahl der Ziffern angibt, die in der endgültigen Darstellung des Partitionswerts für die Spalte enthalten sein sollencolumnName. Beispiel: Ein range-Wert von „1,3“ mit dem digits-Wert „1“ erzeugt die Werte 1, 2 und 3. Derselbe range-Wert mit dem digits-Wert „2" erzeugt die Werte 01, 02 und 03. Vorangehende und nachfolgende Leerzeichen sind zulässig. Der Standard beinhaltet keine feste Anzahl von Ziffern und keine vorangehenden Nullen. | 

## Datumstyp
<a name="partition-projection-date-type"></a>

Verwenden Sie den Datumstyp für Partitionsspalten, deren Werte innerhalb eines definierten Bereichs als Datumsangaben (mit optionalen Uhrzeiten) interpretierbar sind.

**Wichtig**  
Projizierte Datumsspalten werden in Coordinated Universal Time (UTC) zur Abfrageausführungszeit generiert.


****  

| Name der Eigenschaft | Beispielwerte | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `date`  | Erforderlich Der Projektionstyp, der für die Spalte verwendet werden sollcolumnName. Der Wert muss date (ohne Beachtung der Groß- und Kleinschreibung) sein, um die Verwendung des Datumstyps zu signalisieren. Vorangehende und nachfolgende Leerzeichen sind zulässig. | 
| projection.columnName.range |  `201701,201812` `01-01-2010,12-31-2018` `NOW-3YEARS,NOW` `201801,NOW+1MONTH`  |  Erforderlich Eine aus zwei Elementen bestehende, durch Kommas getrennte Liste, die die Minimal- und `range` Maximalwerte für die Spalte enthält. *columnName* Diese Werte sind einschließlich und können jedes Format verwenden, das mit den Java `java.time.*`-Datentypen kompatibel ist. Sowohl der Minimal- als auch der Maximalwert müssen dasselbe Format verwenden. Das in der `.format`-Eigenschaft angegebene Format muss dem Format entsprechen, das für diese Werte verwendet wird. Diese Spalte kann auch relative Datumszeichenfolgen enthalten, die in diesem Muster für reguläre Ausdrücke formatiert sind: `\s*NOW\s*(([\+\-])\s*([0-9]+)\s*(YEARS?\|MONTHS?\|WEEKS?\|DAYS?\|HOURS?\|MINUTES?\|SECONDS?)\s*)?` Leerzeichen sind erlaubt, aber in Datumsliteralen gelten sie als Teil der Datumszeichenfolgen selbst.  | 
| projection.columnName.format |  `yyyyMM` `dd-MM-yyyy` `dd-MM-yyyy-HH-mm-ss`  | Erforderlich Eine Zeichenfolge im Datumsformat, die auf dem Java-Datumsformat basiert. [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) Kann ein beliebiger unterstützter Java.time.\$1-Typ sein. | 
| projection.columnName.interval |  `1` `5`  |  Eine positive Ganzzahl, die das Intervall zwischen aufeinanderfolgenden Partitionswerten für die Spalte angibt*columnName*. Beispiel: Ein `range`-Wert von `2017-01,2018-12` mit einem `interval`-Wert von `1` und einem `interval.unit`-Wert von `MONTHS` erzeugt die Werte 2017-01, 2017-02, 2017-03 usw. Derselbe `range`-Wert mit einem `interval`-Wert von `2` und einem `interval.unit`-Wert von `MONTHS` erzeugt die Werte 2017-01, 2017-03, 2017-05 usw. Vorangehende und nachfolgende Leerzeichen sind zulässig. Wenn die angegebenen Datumsangaben eine Genauigkeit von einem Tag oder einem Monat aufweisen, ist `interval` optional und standardmäßig 1 Tag bzw. 1 Monat. Andernfalls ist `interval` erforderlich.  | 
| projection.columnName.interval.unit |  `YEARS` `MONTHS` `WEEKS` `DAYS` `HOURS` `MINUTES` `SECONDS` `MILLIS`  |  Ein Wort in einer Zeiteinheit, das die serialisierte Form von a [ChronoUnit](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.html)darstellt. Mögliche Werte sind `YEARS`, `MONTHS`, `WEEKS`, `DAYS`, `HOURS`, `MINUTES`, `SECONDS` oder `MILLIS`. Bei den Werten wird die Groß- und Kleinschreibung nicht berücksichtigt. Wenn die angegebenen Datumsangaben eine Genauigkeit von einem Tag oder einem Monat aufweisen, ist `interval.unit` optional und standardmäßig 1 Tag bzw. 1 Monat. Andernfalls ist `interval.unit` erforderlich.  | 

**Example – Partition nach Monat**  
In der folgenden Beispieltabellenkonfiguration werden Daten von 2015 bis heute nach Monaten partitioniert.  

```
'projection.month.type'='date', 
'projection.month.format'='yyyy-MM', 
'projection.month.interval'='1', 
'projection.month.interval.unit'='MONTHS', 
'projection.month.range'='2015-01,NOW', 
...
```

## Injizierter Typ
<a name="partition-projection-injected-type"></a>

Verwenden Sie den injizierten Typ für Partitionsspalten mit möglichen Werten, die nicht prozedural innerhalb eines logischen Bereichs generiert werden können, aber in der `WHERE`-Klausel einer Abfrage als einzelner Wert bereitgestellt werden.

Es ist wichtig, dabei die folgenden Punkte zu beachten:
+ Abfragen zu injizierten Spalten schlagen fehl, wenn nicht für jede injizierte Spalte ein Filterausdruck bereitgestellt wird.
+ Abfragen mit mehreren Werten für einen Filterausdruck in einer injizierten Spalte sind nur erfolgreich, wenn die Werte disjunkt sind.
+ Nur Spalten von `string`-Typen werden unterstützt.
+ Wenn Sie die `WHERE IN`-Klausel mit einer injizierten Partitionsspalte verwenden, gibt es eine Obergrenze von 1.000 Werten, die Sie in der `IN`-Liste angeben können. Um einen Datensatz mit mehr als 1.000 Partitionen für eine injizierte Spalte abzufragen, teilen Sie die Abfrage in mehrere kleinere Abfragen mit jeweils bis zu 1.000 Werten in der `WHERE IN`-Klausel auf und aggregieren Sie dann die Ergebnisse.


****  

| Name der Eigenschaft | Wert | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `injected`  | Erforderlich Der Projektionstyp, der für die Spalte columnName verwendet werden soll. Es wird nur der string-Typ unterstützt. Der angegebene Wert muss injected (ohne Beachtung der Groß- und Kleinschreibung) sein. Vorangehende und nachfolgende Leerzeichen sind zulässig. | 

Weitere Informationen finden Sie unter [Wann sollte der `injected`-Projektionstyp verwendet werden](partition-projection-dynamic-id-partitioning.md#partition-projection-injection).

# Dynamische ID-Partitionierung verwenden
<a name="partition-projection-dynamic-id-partitioning"></a>

Wenn Ihre Daten nach einer Eigenschaft mit hoher Kardinalität partitioniert sind oder die Werte nicht im Voraus bekannt sind, können Sie den `injected`-Projektionstyp verwenden. Beispiele für solche Eigenschaften sind Benutzernamen sowie IDs Geräte oder Produkte. Wenn Sie den `injected`-Projektionstyp zum Konfigurieren eines Partitionsschlüssels verwenden, verwendet Athena Werte aus der Abfrage selbst, um die Menge der zu lesenden Partitionen zu berechnen.

Damit Athena eine Abfrage für eine Tabelle ausführen kann, deren Partitionsschlüssel mit dem `injected`-Projektionstyp konfiguriert ist, muss Folgendes zutreffen:
+ Ihre Abfrage muss mindestens einen Wert für den Partitionsschlüssel enthalten.
+ Bei den Werten muss es sich um Literale oder Ausdrücke handeln, die ohne Lesen von Daten ausgewertet werden können.

Wenn eines dieser Kriterien nicht erfüllt ist, schlägt Ihre Abfrage mit der folgenden Fehlermeldung fehl:

CONSTRAINT\$1VIOLATION: Für die Spalte *column\$1name* mit der injizierten projizierten Partition darf die WHERE-Klausel nur statische Gleichheitsbedingungen enthalten, und mindestens eine solche Bedingung muss erfüllt sein.

## Wann sollte der `injected`-Projektionstyp verwendet werden
<a name="partition-projection-injection"></a>

Stellen Sie sich vor, Sie haben einen Datensatz, der aus Ereignissen von IoT-Geräten besteht, die auf den Geräten IDs partitioniert sind. Dieser Datensatz weist folgende Merkmale auf:
+ Die Geräte IDs werden zufällig generiert.
+ Neue Geräte werden regelmäßig bereitgestellt.
+ Derzeit gibt es Hunderttausende Geräte und in Zukunft werden es Millionen sein.

Dieser Datensatz lässt sich mit herkömmlichen Metastores nur schwer verwalten. Es ist schwierig, die Partitionen zwischen dem Datenspeicher und dem Metastore synchron zu halten. Das Filtern von Partitionen kann während der Abfrageplanung langsam sein. Wenn Sie jedoch eine Tabelle für die Verwendung der Partitionsprojektion konfigurieren und den `injected`-Projektionstyp verwenden, haben Sie zwei Vorteile: Sie müssen keine Partitionen im Metastore verwalten und Ihre Abfragen müssen nicht nach Partitionsmetadaten suchen.

Im folgenden `CREATE TABLE`-Beispiel wird eine Tabelle für den soeben beschriebenen Geräteereignisdatensatz erstellt. Die Tabelle verwendet den Typ der injizierten Projektion.

```
CREATE EXTERNAL TABLE device_events (
  event_time TIMESTAMP,
  data STRING,
  battery_level INT
)
PARTITIONED BY (
  device_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
  "projection.enabled" = "true",
  "projection.device_id.type" = "injected",
  "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${device_id}"
)
```

Die folgende Beispielabfrage ermittelt die Anzahl der Ereignisse, die innerhalb von 12 Stunden von drei bestimmten Geräten empfangen wurden.

```
SELECT device_id, COUNT(*) AS events
FROM device_events
WHERE device_id IN (
  '4a770164-0392-4a41-8565-40ed8cec737e',
  'f71d12cf-f01f-4877-875d-128c23cbde17',
  '763421d8-b005-47c3-ba32-cc747ab32f9a'
)
AND event_time BETWEEN TIMESTAMP '2023-11-01 20:00' AND TIMESTAMP '2023-11-02 08:00'
GROUP BY device_id
```

Wenn Sie diese Abfrage ausführen, identifiziert Athena die drei Werte für den `device_id`-Partitionsschlüssel und verwendet sie zur Berechnung der Partitionsspeicherorte. Athena verwendet den Wert für die `storage.location.template`-Eigenschaft, um die folgenden Standorte zu generieren:
+ `s3://amzn-s3-demo-bucket/prefix/4a770164-0392-4a41-8565-40ed8cec737e`
+ `s3://amzn-s3-demo-bucket/prefix/f71d12cf-f01f-4877-875d-128c23cbde17`
+ `s3://amzn-s3-demo-bucket/prefix/763421d8-b005-47c3-ba32-cc747ab32f9a`

Wenn Sie die `storage.location.template`-Eigenschaft in der Konfiguration der Partitionsprojektion weglassen, verwendet Athena eine Partitionierung im Hive-Stil, um Partitionspositionen basierend auf dem Wert in `LOCATION` zu projizieren (z. B. `s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e`).

# Beispiel für Amazon Data Firehose
<a name="partition-projection-kinesis-firehose-example"></a>

Wenn Sie Firehose verwenden, um Daten an Amazon S3 zu liefern, schreibt die Standardkonfiguration Objekte mit Schlüsseln, die wie im folgenden Beispiel aussehen:

```
s3://amzn-s3-demo-bucket/prefix/yyyy/MM/dd/HH/file.extension
```

Um eine Athena-Tabelle zu erstellen, die die Partitionen automatisch bei der Abfrage findet, können Sie die Partitionsprojektion verwenden, anstatt sie der AWS Glue Data Catalog hinzufügen zu müssen, wenn neue Daten eintreffen.

Im folgenden `CREATE TABLE`-Beispiel wird die Standardkonfiguration von Firehose verwendet.

```
CREATE EXTERNAL TABLE my_ingested_data (
 ...
)
...
PARTITIONED BY (
 datehour STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.datehour.type" = "date",
 "projection.datehour.format" = "yyyy/MM/dd/HH",
 "projection.datehour.range" = "2021/01/01/00,NOW",
 "projection.datehour.interval" = "1",
 "projection.datehour.interval.unit" = "HOURS",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${datehour}/"
)
```

Die `TBLPROPERTIES`-Klausel in der `CREATE TABLE`-Anweisung sagt Athena Folgendes:
+ Verwenden Sie Partitionsprojektion beim Abfragen der Tabelle
+ Der Partitionsschlüssel `datehour` ist vom Typ `date` (welcher eine optionale Zeit beinhaltet)
+ Wie die Daten formatiert werden
+ Der Bereich der Datumszeiten. Beachten Sie, dass die Werte durch Kommata voneinander getrennt werden müssen, nicht durch einen Bindestrich.
+ Wo Sie die Daten auf Amazon S3 finden.

Wenn Sie die Tabelle abfragen, berechnet Athena die Werte für `datehour` und erstellt mithilfe der Speicherortsvorlage eine Liste von Partitionsspeicherorten.

**Topics**
+ [Vorgehensweise zum Verwenden des `date`-Typs](partition-projection-kinesis-firehose-example-using-the-date-type.md)
+ [So wählen Sie Partitionsschlüssel aus](partition-projection-kinesis-firehose-example-choosing-partition-keys.md)
+ [So verwenden Sie benutzerdefinierte Präfixen und dynamische Partitionierung](partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning.md)

# Vorgehensweise zum Verwenden des `date`-Typs
<a name="partition-projection-kinesis-firehose-example-using-the-date-type"></a>

Wenn Sie den `date`-Typ für einen projizierten Partitionsschlüssel verwenden, müssen Sie einen Bereich angeben. Da Sie keine Daten für Datumsangaben haben, bevor der Firehose-Bereitstellungsdatenstrom erstellt wurde, können Sie das Erstellungsdatum als Start verwenden. Und da Sie keine Daten für Datumsangaben in der Zukunft haben, können Sie das spezielle Token `NOW` als Ende verwenden.

Im `CREATE TABLE`-Beispiel wird als Startdatum der 1. Januar 2021 um Mitternacht UTC angegeben.

**Anmerkung**  
Konfigurieren Sie einen Bereich, der Ihren Daten so genau wie möglich entspricht, damit Athena nur nach vorhandenen Partitionen sucht.

Wenn eine Abfrage für die Beispieltabelle ausgeführt wird, verwendet Athena die Bedingungen des `datehour`-Partitionsschlüssels in Kombination mit dem Bereich, um Werte zu generieren. Betrachten Sie folgende Abfrage:

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2020/12/15/00'
AND datehour < '2021/02/03/15'
```

Die erste Bedingung in der `SELECT`-Abfrage verwendet ein Datum, das vor dem Beginn des durch die `CREATE TABLE`-Anweisung angegebenen Datumsbereichs liegt. Da die Partitionsprojektionskonfiguration keine Partitionen für Daten vor dem 1. Januar 2021 angibt, sucht Athena nur an den folgenden Orten nach Daten und ignoriert die früheren Daten in der Abfrage.

```
s3://amzn-s3-demo-bucket/prefix/2021/01/01/00/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/01/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/02/
...
s3://amzn-s3-demo-bucket/prefix/2021/02/03/12/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/13/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/14/
```

Wenn die Abfrage zu einem Datum und einer Uhrzeit vor dem 3. Februar 2021 um 15:00 Uhr ausgeführt wurde, würde die letzte Partition das aktuelle Datum und die Uhrzeit widerspiegeln, nicht das Datum und die Uhrzeit in der Abfragebedingung.

Wenn Sie die neuesten Daten abfragen möchten, können Sie sich die Tatsache zunutze machen, dass Athena keine zukünftigen Daten generiert und nur ein beginnendes `datehour` angeben, wie im folgenden Beispiel.

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2021/11/09/00'
```

# So wählen Sie Partitionsschlüssel aus
<a name="partition-projection-kinesis-firehose-example-choosing-partition-keys"></a>

Sie können angeben, wie die Partitionsprojektion die Partitionspositionen Partitionsschlüsseln zuordnet. Im `CREATE TABLE`-Beispiel im vorigen Abschnitt wurden Datum und Uhrzeit zu einem Partitionsschlüssel namens datehour zusammengefasst, es sind jedoch auch andere Schemata möglich. Zum Beispiel könnten Sie auch eine Tabelle mit separaten Partitionsschlüsseln für Jahr, Monat, Tag und Stunde konfigurieren. 

Die Aufteilung von Daten in Jahr, Monat und Tag bedeutet jedoch, dass der Partitionsprojektionstyp `date` nicht verwendet werden kann. Eine Alternative besteht darin, das Datum von der Stunde zu trennen, um weiterhin den Partitionsprojektionstyp `date` zu nutzen, Abfragen, die Stundenbereiche angeben, aber leichter lesbar zu machen.

Vor diesem Hintergrund trennt das folgende `CREATE TABLE`-Beispiel das Datum von der Stunde. Da `date` es sich um ein reserviertes Wort in SQL handelt, wird in diesem `day`-Beispiel der Name für den Partitionsschlüssel verwendet, der das Datum darstellt.

```
CREATE EXTERNAL TABLE my_ingested_data2 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 hour INT
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy/MM/dd",
 "projection.day.range" = "2021/01/01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.hour.type" = "integer",
 "projection.hour.range" = "0,23",
 "projection.hour.digits" = "2",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${hour}/"
)
```

In der `CREATE TABLE`-Beispielanweisung ist die Stunde ein separater Partitionsschlüssel, der als Ganzzahl konfiguriert ist. Die Konfiguration für den Stundenpartitionsschlüssel gibt den Bereich 0 bis 23 an und dass die Stunde mit zwei Ziffern formatiert werden sollte, wenn Athena die Partitionspositionen generiert.

Eine Abfrage für die `my_ingested_data2`-Tabelle könnte so aussehen:

```
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
```

## Grundlegendes über Partitionsschlüssel- und Partitionsprojektions-Typen
<a name="partition-projection-kinesis-firehose-example-partition-key-types-and-partition-projection-types"></a>

Beachten Sie, dass der `datehour`-Schlüssel im ersten `CREATE TABLE`-Beispiel als `date` in der Partitionsprojektionskonfiguration konfiguriert ist, aber der Typ des Partitionsschlüssels `string` ist. Dies gilt auch für `day` im zweiten Beispiel. Die Typen in der Partitionsprojektionskonfiguration sagen Athena nur, wie die Werte formatiert werden sollen, wenn die Partitionspositionen generiert werden. Die von Ihnen angegebenen Typen ändern den Typ des Partitionsschlüssels nicht – in Abfragen sind `datehour` und `day` vom Typ `string`.

Wenn eine Abfrage eine Bedingung wie `day = '2021/11/09'` enthält, parst Athena die Zeichenfolge auf der rechten Seite des Ausdrucks unter Verwendung des Datumsformats, das in der Partitionsprojektionskonfiguration angegeben ist. Nachdem Athena überprüft hat, dass das Datum innerhalb des konfigurierten Bereichs liegt, wird das Datumsformat erneut als Zeichenfolge in die Speicherortsvorlage eingefügt.

In ähnlicher Weise analysiert Athena für eine Abfragebedingung wie `day > '2021/11/09'` die rechte Seite und generiert eine Liste aller übereinstimmenden Daten innerhalb des konfigurierten Bereichs. Anschließend wird das Datumsformat verwendet, um jedes Datum in die Speicherortvorlage einzufügen, um die Liste der Partitionspositionen zu erstellen.

Das Schreiben der gleichen Bedingung wie `day > '2021-11-09'` oder `day > DATE '2021-11-09'` funktioniert nicht. Im ersten Fall stimmt das Datumsformat nicht überein (beachten Sie die Bindestriche anstelle der Schrägstriche) und im zweiten Fall stimmen die Datentypen nicht überein.

# So verwenden Sie benutzerdefinierte Präfixen und dynamische Partitionierung
<a name="partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning"></a>

Firehose kann mit [benutzerdefinierten Präfixen](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) und [dynamischer Partitionierung](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html) konfiguriert werden. Mit diesen Features können Sie die Amazon-S3-Schlüssel konfigurieren und Partitionierungsschemata einrichten, die Ihren Anwendungsfall besser unterstützen. Sie können auch die Partitionsprojektion mit diesen Partitionierungsschemas verwenden und entsprechend konfigurieren.

Sie könnten beispielsweise das Feature des benutzerdefinierten Präfixes verwenden, um Amazon-S3-Schlüssel mit ISO-formatierten Daten anstelle des Standard-`yyyy/MM/dd/HH`-Schemas zu erhalten.

Sie können auch benutzerdefinierte Präfixe mit dynamischer Partitionierung kombinieren, um eine Eigenschaft wie `customer_id` aus Firehose-Nachrichten zu extrahieren, wie im folgenden Beispiel.

```
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
```

Mit diesem Amazon-S3-Präfix würde der Firehose-Bereitstellungsdatenstrom Objekte in Schlüssel wie `s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension` schreiben. Für eine Eigenschaft wie `customer_id`, bei der die Werte möglicherweise nicht im Voraus bekannt sind, können Sie den Partitionsprojektionstyp `injected` verwenden und eine `CREATE TABLE`-Anweisung wie die folgende verwenden:

```
CREATE EXTERNAL TABLE my_ingested_data3 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 customer_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy-MM-dd",
 "projection.day.range" = "2021-01-01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.customer_id.type" = "injected",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/"
)
```

Wenn Sie eine Tabelle mit einem Partitionsschlüssel vom Typ `injected` abfragen, muss Ihre Abfrage einen Wert für diesen Partitionsschlüssel enthalten. Eine Abfrage für die `my_ingested_data3`-Tabelle könnte so aussehen:

```
SELECT *
FROM my_ingested_data3
WHERE day BETWEEN '2021-11-01' AND '2021-11-30'
AND customer_id = 'customer-1234'
```

## Verwenden Sie den DATE-Typ für den Tagespartitionsschlüssel
<a name="partition-projection-kinesis-firehose-example-iso-formatted-dates"></a>

Da die Werte für den Partitionsschlüssel `day` ISO-formatiert sind, können Sie anstelle von `STRING` auch den Typ `DATE` für den Partitionsschlüssel Tag verwenden, wie im folgenden Beispiel:

```
PARTITIONED BY (day DATE, customer_id STRING)
```

Wenn Sie eine Abfrage durchführen, können Sie mit dieser Strategie Datumsfunktionen für den Partitionsschlüssel verwenden, ohne sie zu analysieren oder umzuwandeln, wie im folgenden Beispiel:

```
SELECT *
FROM my_ingested_data3
WHERE day > CURRENT_DATE - INTERVAL '7' DAY
AND customer_id = 'customer-1234'
```

**Anmerkung**  
Wenn Sie einen Partitionsschlüssel dieses `DATE`-Typs angeben, wird davon ausgegangen, dass Sie das Feature für das [benutzerdefinierte Präfix](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) verwendet haben, um Amazon-S3-Schlüssel mit ISO-formatierten Datumsangaben zu erstellen. Wenn Sie das Standardformat `yyyy/MM/dd/HH` von Firehose verwenden, müssen Sie den Partitionsschlüssel als Typ `string` angeben, obwohl die entsprechende Tabelleneigenschaft vom Typ `date` ist, wie im folgenden Beispiel:  

```
PARTITIONED BY ( 
  `mydate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
   ...
  'projection.mydate.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')
```