

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.

# 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}')
```