

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.

# Ausführen von SQL-Abfragen in Amazon Athena
<a name="querying-athena-tables"></a>

Sie können SQL-Abfragen mit Amazon Athena für Datenquellen ausführen, die bei AWS Glue Data Catalog registriert sind, und Datenquellen wie Hive-Metastores und Amazon-DocumentDB-Instances, mit denen Sie über das Athena-Federated-Query-Feature eine Verbindung herstellen. Weitere Hinweise zum Arbeiten mit Datenquellen finden Sie unter [Verbinden zu Datenquellen](work-with-data-stores.md). Wenn Sie eine DDL-Abfrage (Data Definition Language) ausführen, die das Schema ändert, schreibt Athena die Metadaten in den Metastore, der der Datenquelle zugeordnet ist. Darüber hinaus können einige Abfragen, z. B. `CREATE TABLE AS` und `INSERT INTO`, Datensätze in den Datensatz schreiben und etwa einen CSV-Datensatz zu einem Amazon-S3-Speicherort hinzufügen.

Dieser Abschnitt enthält Anleitungen zum Ausführen von Athena-Abfragen für gängige Datenquellen und Datentypen mit einer Vielzahl von SQL-Anweisungen. Es werden allgemeine Leitlinien für die Arbeit mit gemeinsamen Strukturen und Operatoren gegeben, zum Beispiel für die Arbeit mit Arrays, Verkettung, Filterung, Abflachung und Sortierung. Andere Beispiele sind Abfragen von Daten in Tabellen mit verschachtelten Strukturen und Zuordnungen, Tabellen, die auf JSON-codierten Datensätzen basieren, und Datensätze, die mit AWS-Services Protokollen und Amazon EMR-Protokollen verknüpft sind. AWS CloudTrail Umfassende Abdeckung der SQL-Standardnutzung geht über den Rahmen dieser Dokumentation hinaus. Weitere Informationen zu SQL finden Sie in den Sprachreferenzen [Trino](https://trino.io/docs/current/language.html) und [Presto](https://prestodb.io/docs/current/sql.html).

**Topics**
+ [Anzeigen von Abfrageplänen](query-plans.md)
+ [Arbeiten mit Abfrageergebnissen und aktuellen Abfragen](querying.md)
+ [Abfrageergebnisse in Athena wiederverwenden](reusing-query-results.md)
+ [Abfragestatistiken anzeigen](query-stats.md)
+ [Arbeiten mit Ansichten](views.md)
+ [Gespeicherte Abfragen verwenden](saved-queries.md)
+ [Parametrisierte Abfragen verwenden](querying-with-prepared-statements.md)
+ [Kostenbasierten Optimierer verwenden](cost-based-optimizer.md)
+ [Abfragen der S3 Express One Zone](querying-express-one-zone.md)
+ [Amazon Glacier abfragen](querying-glacier.md)
+ [Schema-Updates verarbeiten](handling-schema-updates-chapter.md)
+ [Arrays abfragen](querying-arrays.md)
+ [Geodaten abfragen](querying-geospatial-data.md)
+ [JSON-Daten abfragen](querying-JSON.md)
+ [ML mit Athena verwenden](querying-mlmodel.md)
+ [Abfrage mit UDFs](querying-udf.md)
+ [Abfragen über Regionen hinweg](querying-across-regions.md)
+ [Fragen Sie die ab AWS Glue Data Catalog](querying-glue-catalog.md)
+ [AWS-Service Logs abfragen](querying-aws-service-logs.md)
+ [Abfragen von Webserverprotokollen](querying-web-server-logs.md)

Überlegungen und Einschränkungen finden Sie unter [Überlegungen und Einschränkungen für SQL-Abfragen in Amazon Athena](other-notable-limitations.md).

# Anzeigen von Ausführungsplänen für SQL-Abfragen
<a name="query-plans"></a>

Sie können den Athena-Abfrage-Editor verwenden, um grafisch dargestellt zu bekommen, wie Ihre Abfrage ausgeführt wird. Wenn Sie im Editor eine Abfrage eingeben und die **Explain**-Option auswählen, verwendet Athena eine [EXPLAIN](athena-explain-statement.md)-SQL-Anweisung für Ihre Abfrage, um zwei entsprechende Diagramme zu erstellen: einen verteilten Ausführungsplan und einen logischen Ausführungsplan. Sie können diese Diagramme verwenden, um Ihre Abfragen zu analysieren, Fehler zu beheben und die Effizienz zu verbessern.

**So zeigen Sie Ausführungspläne für eine Abfrage an**

1. Geben Sie Ihre Abfrage in den Athena-Abfrage-Editor ein und wählen Sie dann **Explain** (Erklären) aus.  
![\[Klicken Sie auf Explain (Erklären) im Athena-Abfrage-Editor.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-plans-1.png)

   Der Reiter **Distributed plan** (Verteilter Plan) zeigt Ihnen den Ausführungsplan für Ihre Abfrage in einer verteilten Umgebung an. Ein verteilter Plan hat Verarbeitungsfragmente oder *Stufen*. Jede Stufe hat eine nullbasierte Indexnummer und wird von einem oder mehreren Knoten verarbeitet. Daten können zwischen Knoten ausgetauscht werden.  
![\[Beispieldiagramm für verteilte Abfragepläne.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-plans-2.png)

1. Verwenden Sie die folgenden Optionen, um im Diagramm zu navigieren:
   + Zum Vergrößern oder Verkleinern scrollen Sie mit der Maus oder verwenden Sie die Vergrößerungssymbole.
   + Um das Diagramm an den Bildschirm anzupassen, wählen Sie die Option **Zoom to fit** (Auf passende Größe zoomen) aus.
   + Zum Bewegen des Diagramms ziehen Sie den Mauszeiger.

1. Um Details für eine Stufe anzuzeigen, wählen Sie die Stufe aus.  
![\[Wählen Sie eine Stufe aus, um die Details dieser Stufe anzuzeigen.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-plans-3.png)

1. Um die Details der Stufe in voller Breite anzuzeigen, wählen Sie das Erweiterungssymbol oben rechts im Detailbereich aus.

1. Um mehr Details anzuzeigen, erweitern Sie ein oder mehrere Elemente im Operator-Baum. Hinweise zu verteilten Planfragmenten finden Sie unter [EXPLAIN-Anweisungs-Ausgabetypen](athena-explain-statement-understanding.md#athena-explain-statement-understanding-explain-plan-types).  
![\[Erweiterter Operator-Baum für eine Stufe in einem verteilten Abfrageplan.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-plans-4.png)
**Wichtig**  
Derzeit sind einige Partitionsfilter im verschachtelten Operator-Baumdiagramm möglicherweise nicht sichtbar, obwohl Athena sie auf Ihre Abfrage anwendet. Um die Wirkung solcher Filter zu überprüfen, führen Sie [EXPLAIN](athena-explain-statement.md#athena-explain-statement-syntax-athena-engine-version-2) oder [EXPLAIN ANALYZE](athena-explain-statement.md#athena-explain-analyze-statement) auf Ihre Anfrage aus und sehen Sie sich die Ergebnisse an.

1. Wählen Sie den Reiter **Logical plan** (Logischer Plan) aus. Das Diagramm zeigt den logischen Plan für die Ausführung Ihrer Abfrage. Informationen über die operativen Bedingungen finden Sie unter [Die Ergebnisse der Athena-EXPLAIN-Anweisung verstehen](athena-explain-statement-understanding.md).  
![\[Grafische Darstellung eines logischen Abfrageplans in Athena.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-plans-5.png)

1. Um einen Plan als SVG- oder PNG-Bild oder als JSON-Text zu exportieren, wählen Sie **Export** (Exportieren) aus.

## Weitere Ressourcen
<a name="query-plans-additional-resources"></a>

Weitere Informationen finden Sie in den folgenden Ressourcen.

[Verwenden von EXPLAIN und EXPLAIN ANALYZE in Athena](athena-explain-statement.md)

[Die Ergebnisse der Athena-EXPLAIN-Anweisung verstehen](athena-explain-statement-understanding.md)

[Anzeigen von Statistiken und Ausführungsdetails für abgeschlossene Abfragen](query-stats.md)

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


# Arbeiten mit Abfrageergebnissen und aktuellen Abfragen
<a name="querying"></a>

Amazon Athena speichert automatisch Abfrageergebnisse und Metadaten zu den Ergebnissen für jede Abfrage, die an einem *Speicherort des Abfrageergebnisses* ausgeführt wird, den Sie in Amazon S3 angeben können. Falls erforderlich, können Sie auf die Dateien an diesem Speicherort zugreifen, um mit ihnen zu arbeiten. Sie können Abfrageergebnisdateien auch direkt von der Athena-Konsole herunterladen.

Athena bietet Ihnen jetzt zwei Optionen für die Verwaltung von Abfrageergebnissen. Sie können entweder einen kundeneigenen S3-Bucket verwenden oder sich für die Feature für verwaltete Abfrageergebnisse entscheiden. Mit Ihrem eigenen Bucket behalten Sie die vollständige Kontrolle über Speicher, Berechtigungen, Lebenszyklusrichtlinien und Aufbewahrung, was Ihnen maximale Flexibilität bietet, jedoch auch einen höheren Verwaltungsaufwand mit sich bringt. Wenn Sie hingegen die Option mit verwalteten Abfrageergebnissen wählen, übernimmt der Dienst automatisch die Speicher- und Lebenszyklusverwaltung, sodass Sie keinen separaten Ergebnis-Bucket konfigurieren müssen und die Ergebnisse nach einer festgelegten Aufbewahrungsfrist automatisch bereinigt werden. Weitere Informationen finden Sie unter [Verwaltete Abfrageergebnisse](managed-results.md).

Informationen zum erstmaligen Einrichten eines Amazon S3 Abfrageergebnisses finden Sie unter [Angeben eines Speicherorts des Abfrageergebnisses mithilfe der Athena-Konsole](query-results-specify-location-console.md).

Ausgabedateien werden automatisch für jede Abfrage gespeichert, die ausgeführt wird. Um mit der Athena-Konsole auf Abfrageausgabedateien zugreifen und diese anzeigen zu können, benötigen IAM-Prinzipale (Benutzer und Rollen) eine Genehmigung für die Amazon S3 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)S3-Aktion für den Speicherort der Abfrageergebnisse sowie eine Genehmigung für die Athena-Aktion. [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryResults.html) Der Speicherort des Abfrageergebnisses kann verschlüsselt werden. Wenn der Speicherort verschlüsselt ist, müssen Benutzer über die entsprechenden Schlüsselberechtigungen zum Ver- und Entschlüsseln des Speicherorts des Abfrageergebnisses verfügen.

**Wichtig**  
IAM-Prinzipale mit Berechtigung für die `GetObject`-Amazon-S3-Aktion für den Speicherort des Abfrageergebnisses können Abfrageergebnisse auch dann von Amazon S3 abrufen, wenn die Berechtigung für die Athena `GetQueryResults`-Aktion verweigert wird.

**Anmerkung**  
Im Fall von abgebrochenen oder fehlgeschlagenen Abfragen hat Athena möglicherweise bereits partielle Ergebnisse zu Amazon S3 geschrieben. In diesen Fällen löscht Athena die partiellen Ergebnisse nicht aus dem Amazon-S3-Präfix, in dem Ergebnisse gespeichert werden. Sie müssen das Amazon-S3-Präfix mit Teilergebnissen entfernen. Athena verwendet mehrteilige Amazon-S3-Uploads, um Daten in Amazon S3 zu schreiben. Wir empfehlen, die Bucket-Lebenszyklusrichtlinie so festzulegen, dass beim Fehlschlagen von Abfragen mehrteilige Uploads abgebrochen werden. Weitere Informationen finden Sie unter [Unvollständige mehrteilige Uploads mit einer Bucket-Lebenszyklusrichtlinie abbrechen](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config) und im *Benutzerhandbuch zu Amazon Simple Storage Service*. 
Unter bestimmten Bedingungen kann Athena die Ausführung von Abfragen automatisch wiederholen. In den meisten Fällen können diese Abfragen erfolgreich abgeschlossen werden und die Abfrage-ID ist als `Completed` gekennzeichnet. Diese Abfragen haben bei den ersten Versuchen möglicherweise zu Teilergebnissen geführt und können zu unvollständigen mehrteiligen Uploads führen.

**Topics**
+ [Verwaltete Abfrageergebnisse](managed-results.md)
+ [Angeben eines Speicherorts des Abfrageergebnisses](query-results-specify-location.md)
+ [Herunterladen von Abfrageergebnisdateien mithilfe der Athena-Konsole](saving-query-results.md)
+ [Anzeigen aktueller Abfragen in der Athena-Konsole](queries-viewing-history.md)
+ [Herunterladen mehrerer aktueller Abfragen in eine CSV-Datei](queries-downloading-multiple-recent-queries-to-csv.md)
+ [Anzeigeoptionen für aktuelle Abfragen konfigurieren](queries-recent-queries-configuring-options.md)
+ [Abfrageverlauf länger als 45 Tage beibehalten](querying-keeping-query-history.md)
+ [Suchen von Abfrageausgabedateien in Amazon S3](querying-finding-output-files.md)

# Verwaltete Abfrageergebnisse
<a name="managed-results"></a>

Mit verwalteten Abfrageergebnissen können Sie SQL-Abfragen ausführen, ohne einen Amazon-S3-Bucket für die Speicherung von Abfrageergebnissen bereitzustellen. Dies erspart Ihnen die Bereitstellung, Verwaltung, Steuerung des Zugriffs auf und Bereinigung Ihrer eigenen S3-Buckets. Erstellen Sie zunächst eine neue Arbeitsgruppe oder bearbeiten Sie eine bestehende Arbeitsgruppe. Wählen Sie unter **Konfiguration der Abfrageergebnisse** die Option **verwaltet von Athena** aus. 

**Schlüssel-Features**
+ Vereinfacht Ihren Arbeitsablauf, da es nicht mehr erforderlich ist, vor dem Ausführen von Abfragen einen S3-Bucket-Speicherort auszuwählen.
+ Keine zusätzlichen Kosten für die Verwendung verwalteter Abfrageergebnisse und das automatische Löschen von Abfrageergebnissen reduziert den Verwaltungsaufwand und die Notwendigkeit separater Bereinigungsprozesse für S3-Buckets.
+ Einfacher Einstieg: neue und bereits bestehende Arbeitsgruppen können einfach konfiguriert werden, um verwaltete Abfrageergebnisse zu verwenden. Sie können eine Mischung aus von Athena verwalteten und von Kunden verwalteten Abfrageergebnissen in Ihrem AWS Konto haben.
+ Optimierte IAM-Berechtigungen mit Zugriff auf das Durchlesen von Ergebnissen über `GetQueryResults` und `GetQueryResultsStream`, die an einzelne Arbeitsgruppen gebunden sind.
+ Die Abfrageergebnisse werden automatisch mit AWS eigenen Schlüsseln Ihrer Wahl oder kundeneigenen Schlüsseln verschlüsselt.

## Überlegungen und Einschränkungen
<a name="managed-results-considerations"></a>

****
+ Der Zugriff auf Abfrageergebnisse wird auf Arbeitsgruppenebene in Athena verwaltet. Dazu benötigen Sie explizite Berechtigungen für `GetQueryResults` und `GetQueryResultsStream` IAM-Aktionen für die jeweilige Arbeitsgruppe. Die `GetQueryResults`-Aktion bestimmt, wer die Ergebnisse einer abgeschlossenen Abfrage in einem paginierten Format abrufen kann, während die `GetQueryResultsStream`-Aktion bestimmt, wer die Ergebnisse einer abgeschlossenen Abfrage streamen kann (häufig von Athena-Treibern verwendet).
+ Sie können keine Abfrageergebnisdateien, die größer als 200 MB sind, von der Konsole herunterladen. Verwenden Sie die `UNLOAD`-Anweisung, um Ergebnisse, die größer als 200 MB sind, an einen Speicherort zu schreiben, den Sie separat herunterladen können.
+ Die Feature für verwaltete Abfrageergebnisse unterstützt die [Wiederverwendung von Abfrageergebnissen](reusing-query-results.md) nicht.
+ Abfrageergebnisse sind 24 Stunden lang verfügbar. Die Abfrageergebnisse werden während dieses Zeitraums kostenlos für Sie gespeichert. Nach Ablauf dieses Zeitraums werden die Abfrageergebnisse automatisch gelöscht.

## Arbeitsgruppe mit verwalteten Abfrageergebnissen erstellen oder bearbeiten
<a name="using-managed-query-results"></a>

Um über die Konsole eine Arbeitsgruppe zu erstellen oder eine bestehende Arbeitsgruppe mit verwalteten Abfrageergebnissen zu aktualisieren:

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/).

1. Wählen Sie im linken Navigationsbereich **Arbeitsgruppen** aus.

1. Wählen Sie **Arbeitsgruppe erstellen**, um eine neue Arbeitsgruppe zu erstellen oder eine bestehende Arbeitsgruppe aus der Liste zu bearbeiten.

1. Wählen Sie unter **Konfiguration der Abfrageergebnisse** die Option **verwaltet von Athena** aus.   
![\[Das Konfigurationsmenü für Abfrageergebnisse.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/athena-managed.png)

1. Wählen Sie unter **Abfrageergebnisse verschlüsseln** die gewünschte Verschlüsselungsoption aus. Weitere Informationen finden Sie unter [Verschlüsselung der Abfrageergebnisse auswählen](#managed-query-results-encryption-at-rest).

1. Geben Sie alle anderen erforderlichen Details ein und wählen Sie **Änderungen speichern**. 

## Verschlüsselung der Abfrageergebnisse auswählen
<a name="managed-query-results-encryption-at-rest"></a>

Es gibt zwei Optionen für die Verschlüsselungskonfiguration:
+ **Mit einem AWS eigenen Schlüssel verschlüsseln** — Dies ist die Standardoption, wenn Sie verwaltete Abfrageergebnisse verwenden. Wählen Sie diese Option, wenn Sie möchten, dass Abfrageergebnisse mit einem AWS eigenen Schlüssel verschlüsselt werden.
+ **Mit einem vom Kunden verwalteten Schlüssel verschlüsseln** – Wählen Sie diese Option, wenn Sie Abfrageergebnisse mit einem vom Kunden verwalteten Schlüssel ver- und entschlüsseln möchten. Um einen vom Kunden verwalteten Schlüssel zu verwenden, fügen Sie den Athena-Service zum Prinzipal-Element des Abschnitts der Schlüsselrichtlinie hinzu. Weitere Informationen finden Sie unter [Richten Sie eine AWS KMS Schlüsselrichtlinie für verwaltete Abfrageergebnisse ein](#managed-query-results-set-up). Um Abfragen erfolgreich auszuführen, benötigt der Benutzer, der Abfragen ausführt, die Berechtigung, auf den AWS KMS Schlüssel zuzugreifen.

## Richten Sie eine AWS KMS Schlüsselrichtlinie für verwaltete Abfrageergebnisse ein
<a name="managed-query-results-set-up"></a>

Der `Principal`-Abschnitt über die Schlüsselrichtlinie gibt an, wer diesen Schlüssel verwenden kann. Mit der Feature für verwaltete Abfrageergebnisse wird der Prinzipal `encryption.athena.amazonaws.com` eingeführt, den Sie in dem `Principal`-Abschnitt angeben müssen. Dieser Service-Principal ist speziell für den Zugriff auf Schlüssel vorgesehen, die nicht Athena gehören. Sie müssen auch die `kms:Decrypt`, `kms:GenerateDataKey` und `kms:DescribeKey`-Aktionen zur Schlüsselrichtlinie hinzufügen, die Sie für den Zugriff auf verwaltete Ergebnisse verwenden. Diese drei Aktionen sind die minimal zulässigen Aktionen.

Verwaltete Abfrageergebnisse verwenden Ihren Arbeitsgruppen-ARN für den [Verschlüsselungskontext](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context). Da es sich bei dem `Principal` Abschnitt um einen AWS Dienst handelt, müssen Sie auch die wichtigsten Richtlinienbedingungen hinzufügen `aws:sourceArn` und `aws:sourceAccount` ergänzen. Das folgende Beispiel zeigt eine AWS KMS wichtige Richtlinie mit Mindestberechtigungen für eine einzelne Arbeitsgruppe.

```
 {
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
      ],
    "Resource": "arn:aws:kms:us-east-1:{account-id}:key/{key-id}",
    "Condition": {
    "ArnLike": {
        "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}",
        "aws:SourceArn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}"
    },
    "StringEquals": {
        "aws:SourceAccount": "{account-id}"
    }
}
```

Das folgende Beispiel für eine AWS KMS Schlüsselrichtlinie ermöglicht es allen Arbeitsgruppen innerhalb desselben Kontos*account-id*, denselben Schlüssel zu verwenden. AWS KMS 

```
{
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:us-east-1:account-id:key/{key-id}",
    "Condition": {
        "ArnLike": {
          "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:account-id:workgroup/*",
          "aws:SourceArn": "arn:aws:athena:us-east-1:account-id:workgroup/*"
        },
        "StringEquals": {
          "aws:SourceAccount": "account-id"
        }
    }
}
```

Zusätzlich zu den Athena- und Amazon S3-Berechtigungen benötigen Sie auch Durchführungs `kms:GenerateDataKey` - und `kms:Decrypt` Aktionsberechtigungen. Weitere Informationen finden Sie unter [Berechtigungen für verschlüsselte Daten in Amazon S3](encryption.md#permissions-for-encrypting-and-decrypting-data). 

Weitere Informationen zur Verschlüsselung verwalteter Abfrageergebnisse finden Sie unter [Verwaltete Abfrageergebnisse verschlüsseln](encrypting-managed-results.md).

# Verwaltete Abfrageergebnisse verschlüsseln
<a name="encrypting-managed-results"></a>

Athena bietet die folgenden Optionen für die Verschlüsselung von [Verwaltete Abfrageergebnisse](managed-results.md) an.

## Verschlüsseln Sie mit einem eigenen Schlüssel AWS
<a name="encrypting-managed-results-aws-owned-key"></a>

Das ist die Standardoption bei Verwendung von verwalteten Abfrageergebnissen. Diese Option gibt an, dass Sie Abfrageergebnisse mit einem AWS eigenen Schlüssel verschlüsseln möchten. AWS Eigene Schlüssel werden nicht in Ihrem AWS Konto gespeichert und sind Teil einer Sammlung von KMS-Schlüsseln, die AWS Eigentümer sind. Wenn Sie AWS eigene Schlüssel verwenden, wird Ihnen keine Gebühr berechnet, und sie werden nicht auf die AWS KMS Kontingente für Ihr Konto angerechnet.

## Verschlüsseln Sie mit einem vom AWS KMS Kunden verwalteten Schlüssel
<a name="encrypting-managed-results-customer-managed-key"></a>

Vom Kunden verwaltete Schlüssel sind die KMS-Schlüssel in Ihrem AWS Konto, die Sie erstellen, besitzen und verwalten. Sie haben die volle Kontrolle über diese KMS-Schlüssel, einschließlich der Festlegung und Pflege ihrer wichtigsten Richtlinien, IAM-Richtlinien und Unterstützungen. Aktivieren und Deaktivieren; Drehen ihres kryptographischen Materials; Hinzufügen von Tags; Erstellen von Aliasen, die auf sie verweisen; und sie zum Löschen planen. Weitere Informationen finden Sie unter [Kundenseitig verwaltete Schlüssel](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk).

## So verwendet Athena vom Kunden verwalteten Schlüssel zur Verschlüsselung von Ergebnissen
<a name="encrypting-managed-results-how-ate-uses-cmk"></a>

Wenn Sie einen vom Kunden verwalteten Schlüssel angeben, verwendet Athena ihn, um die Abfrageergebnisse zu verschlüsseln, wenn sie in verwalteten Abfrageergebnissen gespeichert werden. Derselbe Schlüssel wird verwendet, um die Ergebnisse zu entschlüsseln, wenn Sie `GetQueryResults` aufrufen. Wenn Sie den Status des vom Kunden verwalteten Schlüssels auf deaktiviert setzen oder dessen Löschung planen, verhindert dies, dass Athena und alle Benutzer Ergebnisse mit diesem Schlüssel verschlüsseln oder entschlüsseln können.

Athena verwendet Umschlagverschlüsselung und Schlüsselhierarchie, um Daten zu verschlüsseln. Ihr AWS KMS -Verschlüsselungsschlüssel wird verwendet, um den Stammschlüssel dieser Schlüsselhierarchie zu erzeugen und zu verschlüsseln.

Jedes Ergebnis wird mit dem vom Kunden verwalteten Schlüssel verschlüsselt, der zum Zeitpunkt der Verschlüsselung in der Arbeitsgruppe konfiguriert war. Wenn Sie den Schlüssel auf einen anderen vom Kunden verwalteten Schlüssel oder auf einen AWS eigenen Schlüssel ändern, werden die vorhandenen Ergebnisse nicht erneut mit dem neuen Schlüssel verschlüsselt. Das Löschen und Deaktivieren eines bestimmten vom Kunden verwalteten Schlüssels wirkt sich nur auf die Entschlüsselung der Ergebnisse aus, die mit dem Schlüssel verschlüsselt wurden.

Athena benötigt Zugriff auf Ihren Verschlüsselungsschlüssel, um `kms:Decrypt`, `kms:GenerateDataKey` und `kms:DescribeKey`-Operationen zum Verschlüsseln und Entschlüsseln von Ergebnissen durchzuführen. Weitere Informationen finden Sie unter [Berechtigungen für verschlüsselte Daten in Amazon S3](encryption.md#permissions-for-encrypting-and-decrypting-data). 

Der Prinzipal, der die Abfrage über die `StartQueryExecution`-API einreicht und Ergebnisse liest mithilfen von `GetQueryResults`, muss zusätzlich zu den Berechtigungen Athena und Amazon S3 auch über Berechtigungen für den vom Kunden verwalteten Schlüssel für `kms:Decrypt`, `kms:GenerateDataKey` und `kms:DescribeKey`-Operationen verfügen. Weitere Informationen finden Sie unter [Wichtige Richtlinien](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users) unter. AWS KMS

# Angeben eines Speicherorts des Abfrageergebnisses
<a name="query-results-specify-location"></a>

Der Speicherort des Abfrageergebnisses, den Athena verwendet, wird durch eine Kombination aus Arbeitsgruppeneinstellungen und *clientseitigen Einstellungen* bestimmt. Die clientseitigen Einstellungen basieren darauf, wie Sie die Abfrage ausführen. 
+  Wenn Sie die Abfrage über die Athena-Konsole ausführen, bestimmt der **Speicherort des Abfrageergebnisses**, der unter **Settings (Einstellungen)** in der Navigationsleiste eingegeben wurde, die clientseitige Einstellung. 
+ Wenn Sie die Abfrage mit der Athena-API ausführen, bestimmt der `OutputLocation` Parameter der [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html)Aktion die clientseitige Einstellung. 
+ Wenn Sie die ODBC- oder JDBC-Treiber zum Ausführen von Abfragen verwenden, bestimmt die in der Verbindungs-URL angegebene `S3OutputLocation`-Eigenschaft die clientseitige Einstellung. 

**Wichtig**  
Wenn Sie eine Abfrage mit der API oder mit dem ODBC- oder JDBC-Treiber ausführen, gilt die Konsoleneinstellung nicht. 

Jede Arbeitsgruppenkonfiguration verfügt über eine Option [Override client-side settings (Clientseitige Einstellungen überschreiben)](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html), die aktiviert werden kann. Wenn diese Option aktiviert ist, haben die Arbeitsgruppeneinstellungen Vorrang vor den anwendbaren clientseitigen Einstellungen, wenn ein IAM-Prinzipal, der dieser Arbeitsgruppe zugeordnet ist, die Abfrage ausführt.

## Über zuvor erstellte Standardspeicherorte
<a name="query-results-specify-location-previous-defaults"></a>

Wenn Sie früher eine Abfrage in Athena ausgeführt haben, ohne einen Wert für den **Speicherort für das Abfrageergebnis** anzugeben und wenn die Speicherort-Einstellung für das Abfrageergebnis nicht von einer Arbeitsgruppe überschrieben wurde, wurde früher von Athena ein Standardspeicherort angelegt. Der Standardspeicherort war`aws-athena-query-results-MyAcctID-MyRegion`, wo sich *MyAcctID* die Amazon Web Services Services-Konto-ID des IAM-Prinzipals befand, der die Abfrage ausgeführt hat, und *MyRegion* war die Region, in der die Abfrage ausgeführt wurde (z. B.`us-west-1`.)

Bevor Sie nun eine Athena-Abfrage in einer Region ausführen können, in der Ihr Konto bisher nicht Athena verwendete, müssen Sie einen Speicherort für das Abfrageergebnis angeben oder eine Arbeitsgruppe verwenden, die die Speicherort-Einstellung für das Abfrageergebnis überschreibt. Auch wenn Athena keinen Standardspeicherort für das Abfrageergebnis mehr für Sie erstellt, bleiben zuvor angelegte Standard-`aws-athena-query-results-MyAcctID-MyRegion`-Speicherorte gültig und Sie können sie weiterhin verwenden.

**Topics**
+ [Über zuvor erstellte Standardspeicherorte](#query-results-specify-location-previous-defaults)
+ [Angeben eines Speicherorts des Abfrageergebnisses mithilfe der Athena-Konsole](query-results-specify-location-console.md)
+ [Angeben eines Speicherorts des Abfrageergebnisses mithilfe einer Arbeitsgruppe](query-results-specify-location-workgroup.md)

# Angeben eines Speicherorts des Abfrageergebnisses mithilfe der Athena-Konsole
<a name="query-results-specify-location-console"></a>

Bevor Sie eine Abfrage ausführen können, muss in Amazon S3 ein Speicherort für das Abfrageergebnis angegeben werden, oder Sie müssen eine Arbeitsgruppe verwenden, für die ein Bucket angegeben wurde und deren Konfiguration die Client-Einstellungen überschreibt.

**So geben Sie einen clientseitigen Speicherort für das Abfrageergebnis mit der Athena-Konsole an**

1. [Wechseln](switching-workgroups.md) Sie zu der Arbeitsgruppe, für die Sie einen Speicherort für Abfrageergebnisse angeben möchten. Der Name der Standardarbeitsgruppe ist **primär**.

1. Wählen Sie in der Navigationsleiste **Settings (Einstellungen)** aus.

1. Wählen Sie auf der Navigationsleiste **Manage** (Verwalten).

1. Führen Sie für **Manage settings** (Einstellungen verwalten) einen der folgenden Schritte aus:
   + Geben Sie im Feld **Speicherort der Abfrageergebnisse** den Pfad zu dem Bucket ein, den Sie in Amazon S3 für Ihre Abfrageergebnisse erstellt haben. Stellen Sie dem Pfad einen Präfix mit `s3://` aus.
   + Wählen Sie das Symbol **S3 durchsuchen**, wählen Sie den Amazon-S3-Bucket aus, den Sie in Ihrer aktuellen Region erstellt haben und wählen Sie dann **Auswählen**.
**Anmerkung**  
Wenn Sie eine Arbeitsgruppe verwenden, in der ein Speicherort für das Abfrageergebnis für alle Benutzer der Arbeitsgruppe angegeben wird, steht die Option zum Ändern des Speicherorts für das Abfrageergebnis nicht zur Verfügung.

1. (Optional) Wählen Sie **View lifecycle configuration** (Lebenszykluskonfiguration anzeigen) aus, um die [Amazon S3 lifecycle rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) (Amazon-S3-Lebenszyklusregeln) für Ihren Abfrageergebnis-Bucket anzuzeigen und zu konfigurieren. Die Amazon-S3-Lebenszyklusregeln, die Sie erstellen, können entweder Ablaufregeln oder Übergangsregeln sein. Ablaufregeln löschen Abfrageergebnisse automatisch nach einer bestimmten Zeit. Übergangsregeln verschieben sie auf eine andere Amazon-S3-Speicherebene. Weitere Informationen finden Sie unter [Festlegen der Lebenszykluskonfiguration für einen Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) im Benutzerhandbuch zu Amazon Simple Storage Service.

1. (Optional) Geben Sie unter **Expected Bucket Owner** die ID des Buckets ein, von dem Sie erwarten AWS-Konto , dass er der Besitzer des Buckets für den Ausgabeort sein wird. Dies ist eine zusätzliche Sicherheitsmaßnahme. Wenn die Konto-ID des Bucket-Eigentümers nicht mit der ID übereinstimmt, die Sie hier angeben, schlagen Versuche, in den Bucket auszugeben, fehl. Ausführliche Informationen finden Sie unter [Überprüfen der Bucket-Eigentümerschaft mit Bucket-Eigentümer-Bedingung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html) im *Amazon-S3-Benutzerhandbuch*.
**Anmerkung**  
Die erwartete Bucket-Eigentümereinstellung gilt nur für den Amazon-S3-Ausgabespeicherort, den Sie für Athena-Abfrageergebnisse angeben. Sie gilt nicht für andere Amazon-S3-Speicherorte wie Datenquellenspeicherorte in externen Amazon-S3-Buckets, `CTAS`- und `INSERT INTO`-Speicherorte der Zieltabelle, `UNLOAD`-Speicherorte der Anweisungsangaben, Vorgänge zum Verschütten von Buckets für Verbundabfragen oder `SELECT`-Abfragen, die für eine Tabelle in einem anderen Konto ausgeführt werden.

1. (Optional) Wählen Sie **Encrypt query results** (Abfrageergebnisse verschlüsseln) aus, wenn Sie die in Amazon S3 gespeicherten Abfrageergebnisse verschlüsseln möchten. Weitere Informationen zur Verschlüsselung in Athena finden Sie unter [Verschlüsselung im Ruhezustand](encryption.md).

1. (Optional) Wählen Sie Dem **Bucket-Besitzer die volle Kontrolle über die Abfrageergebnisse zuweisen** aus, um dem Bucket-Besitzer die volle Kontrolle über die Abfrageergebnisse zu gewähren, wenn [ACLs diese Option für den Bucket mit Abfrageergebnissen aktiviert ist](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html). Wenn der Standort Ihres Abfrageergebnisses beispielsweise einem anderen Konto gehört, können Sie dem anderen Konto das Eigentum und die volle Kontrolle über Ihre Abfrageergebnisse gewähren. Weitere Informationen finden Sie unter [Kontrolle des Besitzes von Objekten und Deaktivierung ACLs für Ihren Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) im *Amazon S3 S3-Benutzerhandbuch*.

1. Wählen Sie **Speichern**.

# Angeben eines Speicherorts des Abfrageergebnisses mithilfe einer Arbeitsgruppe
<a name="query-results-specify-location-workgroup"></a>

Sie geben den Speicherort des Abfrageergebnisses in einer Arbeitsgruppenkonfiguration mithilfe der AWS-Managementkonsole, der AWS CLI oder der Athena-API an.

Wenn Sie den verwenden AWS CLI, geben Sie den Speicherort der Abfrageergebnisse mit dem `OutputLocation` Parameter der `--configuration` Option an, wenn Sie den [https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html)Befehl [https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html)or ausführen.

**So geben Sie den Speicherort des Abfrageergebnisses für eine Arbeitsgruppe mithilfe der Athena-Konsole an**

1. Wenn der Navigationsbereich in der Konsole nicht sichtbar ist, wählen Sie das Erweiterungsmenü auf der linken Seite.  
![\[Wählen Sie das Erweiterungsmenü aus.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/nav-pane-expansion.png)

1. Wählen Sie im Navigationsbereich die Option **Workgroups** (Arbeitsgruppen) aus.

1. Wählen Sie in der Liste der Arbeitsgruppen den Link der Arbeitsgruppe aus, die Sie bearbeiten möchten.

1. Wählen Sie **Edit** (Bearbeiten).

1. Führen Sie für **Speicherort und Verschlüsselung des Abfrageergebnisses** einen der folgenden Schritte aus:
   + Geben Sie im Feld **Speicherort des Abfrageergebnisses** den Pfad zu einem Bucket in Amazon S3 für Ihre Abfrageergebnisse ein. Stellen Sie dem Pfad einen Präfix mit `s3://` aus.
   + Wählen Sie das Symbol **S3 durchsuchen**, wählen Sie den Amazon-S3-Bucket aus, den Sie in Ihrer aktuellen Region verwenden möchten und wählen Sie dann **Auswählen**.

1. (Optional) Geben Sie unter **Expected Bucket Owner** die ID des Buckets ein, von dem Sie erwarten AWS-Konto , dass er der Besitzer des Buckets für den Ausgabeort sein wird. Dies ist eine zusätzliche Sicherheitsmaßnahme. Wenn die Konto-ID des Bucket-Eigentümers nicht mit der ID übereinstimmt, die Sie hier angeben, schlagen Versuche, in den Bucket auszugeben, fehl. Ausführliche Informationen finden Sie unter [Überprüfen der Bucket-Eigentümerschaft mit Bucket-Eigentümer-Bedingung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html) im *Amazon-S3-Benutzerhandbuch*.
**Anmerkung**  
Die erwartete Bucket-Eigentümereinstellung gilt nur für den Amazon-S3-Ausgabespeicherort, den Sie für Athena-Abfrageergebnisse angeben. Sie gilt nicht für andere Amazon-S3-Speicherorte wie Datenquellenspeicherorte in externen Amazon-S3-Buckets, `CTAS`- und `INSERT INTO`-Speicherorte der Zieltabelle, `UNLOAD`-Speicherorte der Anweisungsangaben, Vorgänge zum Verschütten von Buckets für Verbundabfragen oder `SELECT`-Abfragen, die für eine Tabelle in einem anderen Konto ausgeführt werden.

1. (Optional) Wählen Sie **Encrypt query results** (Abfrageergebnisse verschlüsseln) aus, wenn Sie die in Amazon S3 gespeicherten Abfrageergebnisse verschlüsseln möchten. Weitere Informationen zur Verschlüsselung in Athena finden Sie unter [Verschlüsselung im Ruhezustand](encryption.md).

1. (Optional) Wählen Sie Dem **Bucket-Besitzer die volle Kontrolle über die Abfrageergebnisse zuweisen** aus, um dem Bucket-Besitzer die volle Kontrolle über die Abfrageergebnisse zu gewähren, wenn [ACLs diese Option für den Bucket mit Abfrageergebnissen aktiviert ist](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html). Wenn der Standort Ihres Abfrageergebnisses beispielsweise einem anderen Konto gehört, können Sie dem anderen Konto das Eigentum und die volle Kontrolle über Ihre Abfrageergebnisse gewähren. 

   Wenn die Einstellung zur S3-Objekteigentümerschaft des Bucket **Bucket owner preferred** (Bucket-Eigentümer bevorzugt) lautet, besitzt der Bucket-Eigentümer auch alle Abfrageergebnisobjekte, die aus dieser Arbeitsgruppe geschrieben wurden. Wenn beispielsweise die Arbeitsgruppe eines externen Kontos diese Option aktiviert und den Speicherort des Abfrageergebnisses auf den Amazon-S3-Bucket Ihres Kontos festlegt, der eine Einstellung zur S3-Objekteigentümerschaft von **Bucket owner preferred** (Bucket-Eigentümer bevorzugt) hat, sind Sie Eigetümer der Abfrageergebnisse der externen Arbeitsgruppe und haben die volle Kontrolle über sie. 

   Wenn Sie diese Option auswählen, wenn die Einstellung zur S3-Objekteigentümerschaft des Bucket **Bucket owner enforced** (Bucket-Eigentümer durchgesetzt) ist, hat dies keine Auswirkungen. Weitere Informationen finden Sie unter [Kontrolle des Besitzes von Objekten und Deaktivierung ACLs für Ihren Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) im *Amazon S3 S3-Benutzerhandbuch*. 

1. Wenn Sie möchten, dass alle Benutzer der Arbeitsgruppe den von Ihnen angegebenen Speicherort für Abfrageergebnisse verwenden, scrollen Sie nach unten zum Abschnitt **Settings** (Einstellungen) und wählen Sie **Override client-side settings** (Clientseitige Einstellungen überschreiben).

1. Wählen Sie **Änderungen speichern ** aus.

# Herunterladen von Abfrageergebnisdateien mithilfe der Athena-Konsole
<a name="saving-query-results"></a>

Sie können die CSV-Datei mit den Abfrageergebnissen direkt nach dem Ausführen einer Abfrage aus dem Abfragebereich herunterladen. Sie können auch Abfrageergebnisse aus den kürzlichen Abfragen von der Registerkarte **Kürzliche Abfragen** herunterladen.

**Anmerkung**  
Athena-Abfrageergebnisdateien sind Dateien, die Informationen enthalten, die von den einzelnen Benutzern konfiguriert werden können. Einige Programme, die diese Daten lesen und analysieren, können möglicherweise einige der Daten als Befehle interpretieren (CSV-Injektion). Wenn Sie CSV-Daten von Abfrageergebnissen in eine Kalkulationstabelle importieren, warnt Sie dieses Programm möglicherweise vor Sicherheitsrisiken. Um Ihr System sicher zu halten, sollten Sie immer Links oder Makros aus heruntergeladenen Abfrageergebnissen deaktivieren.

**So führen Sie eine Abfrage aus und laden die Abfrageergebnisse herunter**

1. Geben Sie Ihre Abfrage in den Abfrage-Editor ein und wählen Sie dann **Run** (Ausführen) aus.

   Wenn die Ausführung der Abfrage abgeschlossen ist, zeigt der Bereich **Results (Ergebnisse)** die Abfrageergebnisse an.

1. Um eine CSV-Datei mit den Abfrageergebnissen herunterzuladen, wählen Sie **Herunterladen von Ergebnissen** über dem Bereich „Abfrageergebnisse“. Je nach Browser- und Browserkonfiguration müssen Sie möglicherweise den Download bestätigen.  
![\[Abfrageergebnisse in einer .csv-Datei in der Athena-Konsole speichern.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/getting-started-query-results-download-csv.png)

**So laden Sie eine Abfrageergebnisdatei für eine frühere Abfrage herunter**

1. Wählen Sie **Recent queries** (Kürzliche Abfragen).  
![\[Wählen Sie Recent queries (Kürzliche Abfragen), um vorherige Abfragen anzuzeigen.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/getting-started-recent-queries.png)

1. Verwenden Sie das Suchfeld, um die Abfrage zu finden, wählen Sie die Abfrage aus und dann **Herunterladen von Ergebnissen**.
**Anmerkung**  
Sie können die Option **Download results** (Ergebnisse herunterladen) nicht verwenden, um Abfrageergebnisse abzurufen, die manuell gelöscht wurden, oder um Abfrageergebnisse abzurufen, die gelöscht oder durch Amazon-S3-[Lebenszyklusregeln](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) an einen anderen Speicherort verschoben wurden.  
![\[Wählen Sie Recent queries (Kürzliche Abfragen), um frühere Abfrageergebnisse zu suchen und herunterzuladen.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-recent-queries-tab-download.png)

# Anzeigen aktueller Abfragen in der Athena-Konsole
<a name="queries-viewing-history"></a>

Sie können die Athena-Konsole verwenden, um zu sehen, welche Abfragen erfolgreich waren oder fehlgeschlagen sind und Fehlerdetails für die fehlgeschlagenen Abfragen anzeigen. Athena hält den Abfrageverlauf 45 Tage lang vor. 

**Anzeigen von aktuellen Abfragen in der Athena-Konsole**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Wählen Sie **Recent queries** (Kürzliche Abfragen). Auf der Registerkarte **Kürzliche Abfragen** werden Informationen zu jeder ausgeführten Abfrage angezeigt.

1. Um eine Abfrageanweisung im Abfrage-Editor zu öffnen, wählen Sie die Ausführungs-ID der Abfrage aus.  
![\[Wählen Sie die Ausführungs-ID einer Abfrage aus, um sie im Abfrageeditor anzuzeigen.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-view-query-statement.png)

1. Um die Details zu einer fehlgeschlagenen Abfrage anzuzeigen, wählen Sie den Link **Fehlgeschlagen** für die Abfrage.  
![\[Wählen Sie den Link Fehlgeschlagen für eine Abfrage zum Anzeigen von Informationen zum Fehler.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-view-query-failure-details.png)

# Herunterladen mehrerer aktueller Abfragen in eine CSV-Datei
<a name="queries-downloading-multiple-recent-queries-to-csv"></a>

Sie können die Registerkarte **Recent queries** (Neueste Abfragen) der Athena-Konsole verwenden, um eine oder mehrere aktuelle Abfragen in eine CSV-Datei zu exportieren, um sie im Tabellenformat anzuzeigen. Die heruntergeladene Datei enthält nicht die Abfrageergebnisse, sondern die SQL-Abfragezeichenfolge selbst und andere Informationen zur Abfrage. Zu den exportierten Feldern gehören die Ausführungs-ID, der Inhalt der Abfragezeichenfolge, die Startzeit der Abfrage, der Status, die Laufzeit, die Menge der gescannten Dateien, die verwendete Version der Abfrage-Engine und die Verschlüsselungsmethode. Sie können maximal 500 kürzlich durchgeführte Abfragen oder maximal 500 gefilterte Abfragen anhand von Kriterien exportieren, die Sie in das Suchfeld eingeben.

**So exportieren Sie eine oder mehrere aktuelle Abfragen in eine CSV-Datei**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Wählen Sie **Recent queries** (Kürzliche Abfragen).

1. (Optional) Verwenden Sie das Suchfeld, um nach den neuesten Abfragen zu filtern, die Sie herunterladen möchten.

1. Wählen Sie **CSV herunterladen** aus.  
![\[Wählen Sie CSV herunterladen aus.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-recent-queries-csv.png)

1. Wählen Sie bei der Aufforderung zum Speichern der Datei **Save** (Speichern). Der Standarddateiname ist `Recent Queries`, gefolgt von einem Zeitstempel (z. B. `Recent Queries 2022-12-05T16 04 27.352-08 00.csv`)

# Anzeigeoptionen für aktuelle Abfragen konfigurieren
<a name="queries-recent-queries-configuring-options"></a>

Sie können Optionen für die Registerkarte **Recent queries** (Aktuelle Abfragen) konfigurieren, z. B. anzuzeigende Spalten und Textumbruch.

**So konfigurieren Sie Optionen für die Registerkarte **Recent queries** (Aktuelle Abfragen)**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Wählen Sie **Recent queries** (Kürzliche Abfragen).

1. Wählen Sie die Optionsschaltfläche (Zahnradsymbol).  
![\[Wählen Sie das Optionsfeld aus, um die Anzeige der Kürzlichen Abfragen zu konfigurieren.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-recent-queries-options.png)

1. In den **Präferenzen** wählen Sie die Anzahl der Zeilen pro Seite, das Zeilenumbruchverhalten und die anzuzeigenden Spalten aus.  
![\[Konfigurieren der Anzeige kürzlicher Abfragen.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-recent-queries-preferences.png)

1. Wählen Sie **Confirm** (Bestätigen).

# Abfrageverlauf länger als 45 Tage beibehalten
<a name="querying-keeping-query-history"></a>

Wenn Sie den Abfrageverlauf länger als 45 Tage beibehalten möchten, können Sie den Abfrageverlauf abrufen und in einem Datenspeicher wie z. B. Amazon S3 speichern. Um diesen Prozess zu automatisieren, können Sie Athena- und Amazon-S3-API-Aktionen und -CLI-Befehle verwenden. Im folgenden Verfahren werden diese Schritte zusammengefasst.

**So rufen Sie den Abfrageverlauf programmgesteuert ab und speichern ihn**

1. Verwenden Sie die [ListQueryExecutions](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListQueryExecutions.html)Athena-API-Aktion oder den [list-query-executions](https://docs.aws.amazon.com/cli/latest/reference/athena/list-query-executions.html)CLI-Befehl, um die Abfrage IDs abzurufen.

1. Verwenden Sie die [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html)Athena-API-Aktion oder den [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html)CLI-Befehl, um Informationen zu jeder Abfrage anhand ihrer ID abzurufen.

1. Verwenden Sie die Amazon [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)S3-API-Aktion oder den Befehl [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html) CLI, um die Informationen in Amazon S3 zu speichern.

# Suchen von Abfrageausgabedateien in Amazon S3
<a name="querying-finding-output-files"></a>

Abfrageausgabedateien werden in Unterordnern in Amazon S3 im folgenden Pfadmuster gespeichert, es sei denn, die Abfrage erfolgt in einer Arbeitsgruppe, deren Konfiguration clientseitige Einstellungen außer Kraft setzt. Wenn die Arbeitsgruppenkonfiguration clientseitige Einstellungen außer Kraft setzt, verwendet die Abfrage den von der Arbeitsgruppe angegebenen Ergebnispfad.

```
QueryResultsLocationInS3/[QueryName|Unsaved/yyyy/mm/dd/]
```
+ *QueryResultsLocationInS3*ist der Speicherort der Abfrageergebnisse, der entweder durch Arbeitsgruppeneinstellungen oder clientseitige Einstellungen angegeben wird. Weitere Informationen finden Sie unter [Angeben eines Speicherorts des Abfrageergebnisses](query-results-specify-location.md) an späterer Stelle in diesem Dokument.
+ Die folgenden Unterordner werden nur für Abfragen erstellt, die von der Konsole ausgeführt werden, deren Ergebnispfad nicht durch die Arbeitsgruppenkonfiguration außer Kraft gesetzt wurde. Abfragen, die von der Athena-API aus AWS CLI oder mithilfe der Athena-API ausgeführt werden, werden direkt in der *QueryResultsLocationInS3* gespeichert.
  + ist *QueryName* der Name der Abfrage, deren Ergebnisse gespeichert wurden. Wenn die Abfrage ausgeführt, aber nicht gespeichert wurde, wird `Unsaved` verwendet. 
  + *yyyy/mm/dd*ist das Datum, an dem die Abfrage ausgeführt wurde.

Dateien, die einer `CREATE TABLE AS SELECT`-Abfrage zugeordnet sind, werden in einem `tables`-Unterordner des obigen Musters gespeichert.

## Identifizieren von Abfrageausgabedateien
<a name="querying-identifying-output-files"></a>

Dateien werden basierend auf dem Namen der Abfrage, der Abfrage-ID und dem Datum, an dem die Abfrage ausgeführt wurde, am Speicherort des Abfrageergebnisses in Amazon S3 gespeichert. Dateien für jede Abfrage werden mit dem *QueryID* benannt. Dabei handelt es sich um einen eindeutigen Bezeichner, den Athena jeder Abfrage zuweist, wenn sie ausgeführt wird.

Die folgenden Dateitypen werden gespeichert:


| Dateityp | Dateibenennungsmuster | Description | 
| --- | --- | --- | 
|  **Abfrageergebnisdateien**  |  `QueryID.csv` `QueryID.txt`  |  DML-Abfrageergebnisdateien werden im CSV-Format (durch Komma getrennte Werte) gespeichert. DDL-Abfrageergebnisse werden als reine Textdateien gespeichert.  Sie können Ergebnisdateien über die Konsole im Bereich **Results (Ergebnisse)** herunterladen, wenn Sie die Konsole verwenden oder über den **Verlauf** der Abfrage. Weitere Informationen finden Sie unter [Herunterladen von Abfrageergebnisdateien mithilfe der Athena-Konsole](saving-query-results.md).  | 
|  **Abfragemetadatendateien**  |  `QueryID.csv.metadata` `QueryID.txt.metadata`  |  DML- und DDL-Abfragemetadateien werden im Binärformat gespeichert und sind nicht lesbar. Die Dateierweiterung entspricht der zugehörigen Abfrageergebnisdatei. Athena verwendet die Metadaten beim Lesen von Abfrageergebnissen mithilfe der `GetQueryResults`-Aktion Obwohl diese Dateien gelöscht werden können, empfehlen wir dies nicht, da wichtige Informationen über die Abfrage verloren gehen.  | 
|  **Daten-Manifest-Dateien**  |  `QueryID-manifest.csv`  |  Daten-Manifest-Dateien werden generiert, um Dateien nachzuverfolgen, die Athena in Amazon-S3-Datenquellenspeicherorten erstellt, wenn eine [INSERT INTO](insert-into.md)-Abfrage ausgeführt wird. Wenn eine Abfrage fehlschlägt, verfolgt das Manifest auch Dateien, die die Abfrage schreiben wollte. Das Manifest ist nützlich für die Identifizierung verwaister Dateien, die aus einer fehlgeschlagenen Abfrage resultieren.  | 

## Verwenden Sie den AWS CLI , um den Speicherort und die Dateien der Abfrage zu identifizieren
<a name="querying-finding-output-files-cli"></a>

 AWS CLI Um den Abfrageausgabeort und die Ergebnisdateien zu identifizieren, führen Sie den `aws athena get-query-execution` Befehl wie im folgenden Beispiel aus. Ersetzen Sie ihn *abc1234d-5efg-67hi-jklm-89n0op12qr34* durch die Abfrage-ID.

```
aws athena get-query-execution --query-execution-id abc1234d-5efg-67hi-jklm-89n0op12qr34
```

Daraufhin erhalten Sie ein Ergebnis, das dem hier dargestellten entspricht. Eine Beschreibung der einzelnen Ausgabeparameter finden Sie [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html)in der *AWS CLI Befehlsreferenz*.

```
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1565649050.175,
            "State": "SUCCEEDED",
            "CompletionDateTime": 1565649056.6229999
        },
        "Statistics": {
            "DataScannedInBytes": 5944497,
            "DataManifestLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34-manifest.csv",
            "EngineExecutionTimeInMillis": 5209
        },
        "ResultConfiguration": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_S3"
            },
            "OutputLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34"
        },
        "QueryExecutionId": "abc1234d-5efg-67hi-jklm-89n0op12qr34",
        "QueryExecutionContext": {},
        "Query": "INSERT INTO mydb.elb_log_backup SELECT * FROM mydb.elb_logs LIMIT 100",
        "StatementType": "DML",
        "WorkGroup": "primary"
    }
}
```

# Abfrageergebnisse in Athena wiederverwenden
<a name="reusing-query-results"></a>

Wenn Sie eine Abfrage in Athena erneut ausführen, können Sie optional auswählen, ob das zuletzt gespeicherte Abfrageergebnis wiederverwendet werden soll. Diese Option kann die Leistung erhöhen und die Kosten in Bezug auf die Anzahl der gescannten Byte reduzieren. Die Wiederverwendung von Abfrageergebnissen ist beispielsweise dann sinnvoll, wenn Sie wissen, dass sich die Ergebnisse innerhalb eines bestimmten Zeitrahmens nicht ändern werden. Sie können ein Höchstalter für die Wiederverwendung von Abfrageergebnissen festlegen. Athena verwendet das gespeicherte Ergebnis, solange es nicht älter als das von Ihnen angegebene Alter ist. Weitere Informationen finden Sie unter [Kosten reduzieren und die Abfrageleistung verbessern mit Amazon Athena](https://aws.amazon.com/blogs/big-data/reduce-cost-and-improve-query-performance-with-amazon-athena-query-result-reuse/) im *AWS -Big-Data-Blog*.

## Schlüssel-Features
<a name="reusing-query-results-key-features"></a>

Wenn Sie die Wiederverwendung von Ergebnissen für eine Abfrage aktivieren, sucht Athena nach einer vorherigen Ausführung der Abfrage innerhalb derselben Arbeitsgruppe. Wenn Athena eine Übereinstimmung findet, umgeht sie die Ausführung und gibt das Abfrageergebnis der vorherigen, passenden Ausführung zurück. Sie können die Wiederverwendung von Abfrageergebnissen für jede einzelne Abfrage aktivieren.

Athena verwendet das letzte Abfrageergebnis erneut, wenn alle der folgenden Bedingungen erfüllt sind:
+ Die Abfragezeichenfolgen stimmen überein, wie von Athena bestimmt.
+ Datenbank- und Katalognamen stimmen überein.
+ Das vorherige Ergebnis ist nicht abgelaufen.
+ Die Konfiguration der Abfrageergebnisse entspricht der Konfiguration der Abfrageergebnisse der vorherigen Ausführung.
+ Sie haben Zugriff auf alle Tabellen, auf die in der Abfrage verwiesen wird.
+ Sie haben Zugriff auf den Speicherort der S3-Datei, in dem das vorherige Ergebnis gespeichert ist.

Wenn eine dieser Bedingungen nicht erfüllt ist, führt Athena die Abfrage aus, ohne die zwischengespeicherten Ergebnisse zu verwenden.

## Überlegungen und Einschränkungen
<a name="reusing-query-results-considerations-and-limitations"></a>

Beachten Sie bei der Verwendung des Wiederverwendungsfeatures für Abfrageergebnisse die folgenden Punkte:
+ Athena verwendet Abfrageergebnisse nur innerhalb derselben Arbeitsgruppe wieder.
+ Das Feature zur Wiederverwendung von Abfrageergebnissen berücksichtigt Arbeitsgruppenkonfigurationen. Wenn Sie die Ergebniskonfiguration für eine Abfrage überschreiben, ist das Feature deaktiviert.
+ Nur Abfragen, die Ergebnismengen auf Amazon S3 erzeugen, werden unterstützt. Andere Aussagen als `SELECT` und `EXECUTE` werden nicht unterstützt.
+ Apache Hive-, Apache Hudi-, Apache Iceberg- und Delta Lake-Tabellen der Linux Foundation, bei AWS Glue denen sie registriert sind, werden unterstützt. Externe Hive-Metastores werden nicht unterstützt.
+ Abfragen, die auf Verbundkataloge oder einen externen Hive-Metastore verweisen, werden nicht unterstützt.
+ Die Wiederverwendung von Abfrageergebnissen wird für in Lake Formation registrierte Tabellen nicht unterstützt.
+ Die Wiederverwendung von Abfrageergebnissen wird nicht unterstützt, wenn der Amazon-S3-Speicherort der Tabellenquelle als Datenstandort in Lake Formation registriert ist. 
+ Tabellen mit Zeilen- und Spaltenberechtigungen werden nicht unterstützt.
+ Tabellen mit detaillierter Zugriffskontrolle (z. B. Spalten- oder Zeilenfilterung) werden nicht unterstützt.
+ Abfragen, die auf eine Tabelle verweisen, die nicht unterstützt wird, sind nicht für die Wiederverwendung von Abfrageergebnissen geeignet.
+ AAthena erfordert, dass Sie über Amazon-S3-Leseberechtigungen verfügen, damit die zuvor generierte Ausgabedatei wiederverwendet werden kann.
+ Die Funktion zur Wiederverwendung von Abfrageergebnissen geht davon aus, dass der Inhalt des vorherigen Ergebnisses nicht geändert wurde. Athena überprüft die Integrität eines früheren Ergebnisses nicht, bevor es verwendet wird.
+ Wenn die Abfrageergebnisse der vorherigen Ausführung gelöscht oder an einen anderen Ort in Amazon S3 verschoben wurden, werden die Abfrageergebnisse bei der nachfolgenden Ausführung derselben Abfrage nicht wiederverwendet. 
+ Potenziell veraltete Ergebnisse können zurückgegeben werden. Athena sucht erst nach Änderungen an den Quelldaten, wenn das von Ihnen angegebene maximale Wiederverwendungsalter erreicht ist.
+ Wenn mehrere Ergebnisse zur Wiederverwendung verfügbar sind, verwendet Athena das neueste Ergebnis.
+ Abfragen, die nicht deterministische Operatoren oder Funktionen wie `rand()` oder `shuffle()` verwenden, verwenden keine zwischengespeicherten Ergebnisse. Beispielsweise ist `LIMIT` ohne `ORDER BY` nicht deterministisch und wird nicht zwischengespeichert, aber `LIMIT` mit `ORDER BY` ist deterministisch und wird zwischengespeichert.
+ Um das Feature zur Wiederverwendung von Abfrageergebnissen mit JDBC zu verwenden, ist mindestens die Treiberversion 2.0.34.1000 erforderlich. Für ODBC ist die mindestens erforderliche Treiberversion 1.1.19.1002. Informationen zum Treiber-Download finden Sie unter [Verbindung zu Amazon Athena mit ODBC- und JDBC-Treibern herstellen](athena-bi-tools-jdbc-odbc.md).
+ Die Wiederverwendung von Abfrageergebnissen wird für Abfragen, die mehr als einen Datenkatalog verwenden, nicht unterstützt. 
+  Die Wiederverwendung von Abfrageergebnissen wird für Abfragen, die mehr als 20 Tabellen enthalten, nicht unterstützt.
+ Bei Abfragezeichenfolgen mit einer Größe von weniger als 100 KB werden Unterschiede in Kommentaren und Leerraum ignoriert `INNER JOIN` und bei der `JOIN` Wiederverwendung der Ergebnisse als gleichwertig behandelt. Abfragezeichenfolgen, die größer als 100 KB sind, müssen exakt übereinstimmen, damit Ergebnisse wiederverwendet werden können.
+ Ein Abfrageergebnis gilt als abgelaufen, wenn es älter als das angegebene Höchstalter ist, oder älter als die Standardeinstellung von 60 Minuten, wenn kein Höchstalter angegeben wurde. Das Höchstalter für Abfrageergebnissen kann in Minuten, Stunden oder Tagen angegeben werden. Das Höchstalter, das angegeben werden kann, entspricht 7 Tagen, unabhängig von der verwendeten Zeiteinheit.
+ [Verwaltete Abfrageergebnisse](https://docs.aws.amazon.com/athena/latest/ug/managed-results.html) werden nicht unterstützt.

## Wie man Abfrageergebnisse in der Athena-Konsole wiederverwendet
<a name="reusing-query-results-athena-console"></a>

Um das Feature zu verwenden, aktivieren Sie die Option **Reuse query results** (Abfrageergebnisse wiederverwenden) im Athena-Abfrage-Editor.

![\[Aktivieren Sie Reuse query results (Abfrageergebnisse wiederverwenden) im Athena-Abfrage-Editor.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/reusing-query-results-1.png)


**So konfigurieren Sie das Feature zur Wiederverwendung von Abfrageergebnissen**

1. Wählen Sie im Athena-Abfrage-Editor unter der Option **Reuse query results** (Abfrageergebnisse wiederverwenden) das Bearbeitungssymbol neben **up to 60 minutes ago** (bis zu 60 Minuten vorher) aus.

1. Wählen Sie im Dialogfeld **Edit reuse time** (Wiederverwendungszeit bearbeiten) aus dem Feld auf der rechten Seite eine Zeiteinheit (Minuten, Stunden oder Tage) aus.

1. Geben Sie im Feld auf der linken Seite die Anzahl der Zeiteinheiten ein, die Sie festlegen möchten, oder wählen Sie diese aus. Die maximale Zeit, die Sie eingeben können, entspricht sieben Tagen, unabhängig von der gewählten Zeiteinheit.  
![\[Höchstalter für die Wiederverwendung von Abfrageergebnissen konfigurieren.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/reusing-query-results-2.png)

1. Wählen Sie **Bestätigen** aus.

   Ein Banner bestätigt Ihre Konfigurationsänderung, und die Option **Reuse query results** (Abfrageergebnisse wiederverwenden) zeigt Ihre neue Einstellung an.

# Anzeigen von Statistiken und Ausführungsdetails für abgeschlossene Abfragen
<a name="query-stats"></a>

Nachdem Sie eine Abfrage ausgeführt haben, können Sie Statistiken über die verarbeiteten Eingabe- und Ausgabedaten abrufen, eine grafische Darstellung der für jede Phase der Abfrage benötigten Zeit anzeigen und interaktiv Ausführungsdetails untersuchen.

**So zeigen Sie Abfragestatistiken für eine abgeschlossene Abfrage an**

1. Nachdem Sie eine Abfrage im Athena-Abfrage-Editor ausgeführt haben, wählen Sie den Reiter **Query stats** (Abfragestatistiken) aus.  
![\[Wählen Sie Query stats (Abfragestatistiken) aus.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-stats-1.png)

   Die Registerkarte **Query stats** (Abfragestatistiken) enthält die folgenden Informationen:
   + **Data processed** (verarbeitete Daten) – Zeigt Ihnen die Anzahl der verarbeiteten Eingabezeilen und Bytes sowie die Anzahl der ausgegebenen Zeilen und Bytes an.
   + **The Total runtime** (Gesamtlaufzeit) – Zeigt die Gesamtzeit an, die die Abfrage zur Ausführung benötigt hat, und stellt grafisch dar, wie viel dieser Zeit für Warteschlangen, Planung, Ausführung und Serviceverarbeitung aufgewendet wurde.
**Anmerkung**  
Informationen zur Anzahl der Eingabe- und Ausgabezeilen auf Phasenebene und zur Datengröße werden nicht angezeigt, wenn für eine Abfrage in Lake Formation Filter auf Zeilenebene definiert sind.

1. Um interaktiv Informationen zur Ausführung der Abfrage zu untersuchen, wählen Sie **Execution details** (Ausführungsdetails) aus.  
![\[Wählen Sie Execution details (Ausführungsdetails) aus.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-stats-2.png)

   Die Seite **Execution details** (Ausführungsdetails) zeigt die Ausführungs-ID für die Abfrage und ein Diagramm der nullbasierten Stufen in der Abfrage. Die Stufen sind von Anfang bis Ende von unten nach oben angeordnet. Die Bezeichnung jeder Stufe zeigt die Zeit an, die die Stufe für die Ausführung benötigt hat.
**Anmerkung**  
Die Gesamtlaufzeit und die Ausführungszeit einer Abfrage unterscheiden sich häufig erheblich. Beispielsweise kann eine Abfrage mit einer Gesamtlaufzeit in Minuten die Ausführungszeit für eine Phase in Stunden anzeigen. Da es sich bei einer Phase um eine logische Recheneinheit handelt, die parallel für viele Aufgaben ausgeführt wird, entspricht die Ausführungszeit einer Phase der Gesamtausführungszeit aller ihrer Aufgaben. Trotz dieser Diskrepanz kann die Ausführungszeit einer Phase als relativer Indikator dafür nützlich sein, welche Phase in einer Abfrage am rechenintensivsten war.  
![\[Die Seite „Execution details“ (Ausführungsdetails).\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-stats-3.png)

   Verwenden Sie die folgenden Optionen, um im Diagramm zu navigieren:
   + Zum Vergrößern oder Verkleinern scrollen Sie mit der Maus oder verwenden Sie die Vergrößerungssymbole.
   + Um das Diagramm an den Bildschirm anzupassen, wählen Sie die Option **Zoom to fit** (Auf passende Größe zoomen) aus.
   + Zum Bewegen des Diagramms ziehen Sie den Mauszeiger.

1. Um mehr Details zu einer Stufe einzusehen, wählen Sie die Stufe aus. Der Stufendetailbereich auf der rechten Seite zeigt die Anzahl der Ein- und Ausgaben von Zeilen und Bytes sowie einen Operator-Baum an.  
![\[Stufendetailbereich.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-stats-4.png)

1. Um die Details der Stufe in voller Breite anzuzeigen, wählen Sie das Erweiterungssymbol oben rechts im Detailbereich aus.

1. Um Informationen über die Teile der Stufe zu erhalten, erweitern Sie ein oder mehrere Elemente im Operator-Baum.  
![\[Erweiterter Operator-Baum.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/query-stats-5.png)

Weitere Informationen zu Ausführungsdetails finden Sie unter [Die Ergebnisse der Athena-EXPLAIN-Anweisung verstehen](athena-explain-statement-understanding.md).

## Weitere Ressourcen
<a name="query-stats-additional-resources"></a>

Weitere Informationen finden Sie in den folgenden Ressourcen.

[Anzeigen von Ausführungsplänen für SQL-Abfragen](query-plans.md)

[Verwenden von EXPLAIN und EXPLAIN ANALYZE in Athena](athena-explain-statement.md)

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


# Arbeiten mit Ansichten
<a name="views"></a>

Eine Ansicht in Amazon Athena ist eine logische, keine physische Tabelle. Die Abfrage, die eine Ansicht definiert, wird jedes Mal ausgeführt, wenn in einer Abfrage auf die Ansicht verwiesen wird. Sie können eine Ansicht aus einer `SELECT`-Abfrage erstellen und dann in zukünftigen Abfragen auf diese Ansicht verweisen. 

In Athena können Sie zwei verschiedene Arten von Ansichten verwenden: Athena-Ansichten und AWS Glue Data Catalog -Ansichten.

## Einsetzen von Athena-Ansichten – wann sinnvoll?
<a name="when-to-use-views"></a>

Sie können Athena-Ansichten für folgende Zwecke erstellen: 
+ **Abfrage einer Teilmenge von Daten** – Sie können beispielsweise eine Ansicht mit einer Teilmenge der Spalten aus der ursprünglichen Tabelle erstellen. Dadurch werden Abfragen von Daten vereinfacht. 
+ **Tabellen kombinieren** – Sie können Ansichten verwenden, um mehrere Tabellen zu einer Abfrage zu kombinieren. Wenn Sie mehrere Tabellen haben und sie mit `UNION ALL` kombinieren möchten, können Sie mit diesem Ausdruck eine Ansicht erstellen, um Abfragen für die kombinierten Tabellen zu vereinfachen.
+ **Komplexität ausblenden** – Verwenden Sie Ansichten, um die Komplexität bestehender Basisabfragen auszublenden und die von Benutzern ausgeführten Abfragen zu vereinfachen. Basis-Abfragen sind häufig Joins zwischen Tabellen, Ausdrücke in der Spaltenliste und andere SQL-Syntax, die schwer zu verstehen und zu debuggen ist. Sie können eine Ansicht erstellen, mit der die Komplexität ausgeblendet wird und die Abfragen vereinfacht werden.
+ **Abfragen optimieren** – Mithilfe von Ansichten können Sie mit Optimierungstechniken experimentieren, um optimierte Abfragen zu erstellen. Wenn Sie beispielsweise eine Kombination von `WHERE`-Bedingungen, `JOIN`-Reihenfolge oder andere Ausdrücke finden, die eine optimale Leistung zeigen, erstellen Sie eine Ansicht mit diesen Klauseln und Ausdrücken. Anwendungen können anschließend relativ einfache Abfragen für diese Ansicht ausführen. Wenn Sie zu einem späteren Zeitpunkt eine bessere Möglichkeit finden, die ursprüngliche Abfrage zu optimieren, wenn Sie die Ansicht neu erstellen, profitieren alle Anwendungen sofort von den Vorteilen der optimierten Basis-Abfrage. 
+ **Zugrunde liegende Namen ausblenden** – Mit Ansichten können Sie zugrunde liegende Tabellen- und Spaltennamen ausblenden und Wartungsprobleme minimieren, wenn sich die Namen ändern. Wenn sich die Namen ändern, können Sie die Ansicht einfach mit den neuen Namen neu erstellen. Abfragen, die die Ansicht anstelle der Tabellen direkt verwenden, werden weiterhin ohne Änderungen ausgeführt.

  Weitere Informationen finden Sie unter [Arbeiten mit Athena-Ansichten](views-console.md).

## Wann sollte man AWS Glue Data Catalog Views verwenden?
<a name="when-to-use-views-gdc"></a>

Verwenden Sie AWS Glue Data Catalog Ansichten, wenn Sie eine einzige gemeinsame Ansicht für Amazon Athena und Amazon Redshift AWS-Services wünschen. In Data-Catalog-Ansichten werden die Zugriffsberechtigungen durch den Benutzer definiert, der die Ansicht erstellt hat, und nicht durch den Benutzer, der die Ansicht abfragt. Diese Methode zum Gewähren von Berechtigungen wird als *Definer*-Semantik bezeichnet.

Die folgenden Anwendungsfälle veranschaulichen, wie Sie Data-Catalog-Ansichten verwenden können.
+ **Bessere Zugriffskontrolle** – Sie erstellen eine Ansicht, die den Datenzugriff basierend auf der vom Benutzer benötigten Berechtigungsebene einschränkt. Mithilfe von Data-Catalog-Ansichten können Sie beispielsweise verhindern, dass Mitarbeiter, die nicht in der Personalabteilung arbeiten, personenbezogene Daten sehen.
+ **Vollständige Datensätze sicherstellen** – Durch die Anwendung bestimmter Filter auf Ihre Data-Catalog-Ansicht stellen Sie sicher, dass die Datensätze in einer Data-Catalog-Ansicht immer vollständig sind.
+ **Verbesserte Sicherheit** – In Data-Catalog-Ansichten muss die Abfragedefinition, mit der die Ansicht erstellt wird, intakt sein, damit die Ansicht erstellt werden kann. Dadurch sind Data-Catalog-Ansichten weniger anfällig für SQL-Befehle von böswilligen Akteuren.
+ **Zugriff auf zugrunde liegende Tabellen verhindern** – Definer-Semantik ermöglicht es Benutzern, auf eine Ansicht zuzugreifen, ohne ihnen die zugrunde liegende Tabelle zur Verfügung zu stellen. Zugriff auf die Tabellen benötigt nur der Benutzer, der die Ansicht definiert.

Definitionen der Data-Catalog-Ansicht werden im AWS Glue Data Catalog gespeichert. Dies bedeutet, dass Sie AWS Lake Formation verwenden können, um den Zugriff durch Ressourcengewährung, Spaltengewährung oder Tag-basierte Zugriffskontrollen zu gewähren. Weitere Informationen zum Gewähren und Widerrufen des Zugriffs in Lake Formation finden Sie unter [Gewähren und Widerrufen von Berechtigungen für Data-Catalog-Ressourcen](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html) im *AWS Lake Formation -Entwicklerhandbuch*.

Weitere Informationen finden Sie unter [Datenkatalog-Ansichten in Athena verwenden](views-glue.md).

# Arbeiten mit Athena-Ansichten
<a name="views-console"></a>

Athena-Ansichten können einfach in der Athena-Konsole erstellt, aktualisiert und verwaltet werden.

## Ansichten erstellen
<a name="creating-views"></a>

Sie können eine Ansicht in der Athena-Konsole erstellen, indem Sie eine Vorlage verwenden oder eine vorhandene Abfrage ausführen.

**So erstellen Sie eine Ansicht mithilfe einer Vorlage**

1. Wählen Sie in der Athena-Konsole neben **Tables and views** (Tabellen und Ansichten) **Create** (Erstellen) und dann **Create view** (Ansicht erstellen) aus.  
![\[Erstellen einer Ansicht.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/create-view.png)

   Diese Aktion platziert eine bearbeitbare Ansichtsvorlage in den Abfrage-Editor. 

1. Bearbeiten Sie die Anzeigevorlage entsprechend Ihren Anforderungen. Wenn Sie einen Namen für die Ansicht in die Anweisung eingeben, denken Sie daran, dass Ansichtsnamen keine anderen Sonderzeichen als den Unterstrich `(_)`enthalten können. Siehe [Namen für Datenbanken, Tabellen und Spalten](tables-databases-columns-names.md). Vermeiden Sie [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md) für die Benennung von Ansichten. 

   Weitere Informationen zum Erstellen von Ansichten finden Sie unter [CREATE VIEW und CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) und [Beispiele für Athena-Ansichten](views-examples.md). 

1. Wählen Sie **Run** (Ausführen), um die Ansicht zu erstellen. Die Ansicht wird in der Liste der Ansichten in der Athena-Konsole angezeigt.

**So erstellen Sie eine Ansicht aus einer vorhandenen Abfrage**

1. Verwenden Sie den Athena-Abfrage-Editor, um eine vorhandene Abfrage auszuführen.

1. Wählen Sie im Fenster des Abfrage-Editors **Create** (Erstellen) und dann **View from query** (Aus Abfrage anzeigen) aus.  
![\[Wählen Sie Creat (Erstellen), View from query (Aus Abfrage anzeigen) aus.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/create-view-from-query.png)

1. Geben Sie im Dialogfeld **Create View** (Ansicht erstellen) einen Namen für die Ansicht ein und wählen Sie **Create** (Erstellen). Ansichtsnamen dürfen keine Sonderzeichen enthalten außer Unterstriche `(_)`. Siehe [Namen für Datenbanken, Tabellen und Spalten](tables-databases-columns-names.md). Vermeiden Sie [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md) für die Benennung von Ansichten.

   Athena fügt die Ansicht zur Liste der Ansichten in der Konsole hinzu und zeigt die`CREATE VIEW`-Anweisung für die Ansicht im Abfrage-Editor.

**Hinweise**
+ Wenn Sie eine Tabelle löschen, auf der eine Tabelle basiert, und anschließend versuchen, die Ansicht auszuführen, wird in Athena eine Fehlermeldung angezeigt.
+ Sie können eine verschachtelte Ansicht erstellen. Dabei handelt es sich um eine Ansicht auf eine vorhandene Ansicht. Athena verhindert, dass Sie eine rekursive Ansicht ausführen, die auf sich selbst verweist.

# Beispiele für Athena-Ansichten
<a name="views-examples"></a>

Verwenden Sie zum Anzeigen der Syntax für die Ansichtsabfrage [SHOW CREATE VIEW](show-create-view.md).

**Example Beispiel 1**  
Stellen Sie sich folgende zwei Tabellen vor: eine Tabelle `employees` mit zwei Spalten, `id` und `name`, und eine Tabelle `salaries` mit zwei Spalten, `id` und `salary`.   
In diesem Beispiel erstellen wir eine Ansicht mit dem Namen `name_salary` `SELECT` Query, die eine Liste von Gehältern erhält, die den IDs Tabellen zugeordnet sind, und: `employees` `salaries`  

```
CREATE VIEW name_salary AS
SELECT
 employees.name, 
 salaries.salary 
FROM employees, salaries 
WHERE employees.id = salaries.id
```

**Example Beispiel 2**  
Im folgenden Beispiel erstellen wir eine Ansicht mit dem Namen `view1` , mit der Sie die komplexere Abfrage-Syntax ausblenden.   
Diese Ansicht läuft auf zwei Tabellen, `table1` und `table2`, wobei jede Tabelle eine andere `SELECT`-Abfrage ist. Die Ansicht wählt Spalten aus `table1` und fügt die Ergebnisse mit `table2` zusammen. Der Join basiert auf der Spalte `a`, die in beiden Tabellen vorhanden ist.  

```
CREATE VIEW view1 AS
WITH
  table1 AS (
         SELECT a, 
         MAX(b) AS the_max 
         FROM x 
         GROUP BY a
         ),
  table2 AS (
         SELECT a, 
         AVG(d) AS the_avg 
         FROM y 
         GROUP BY a)
SELECT table1.a, table1.the_max, table2.the_avg
FROM table1
JOIN table2 
ON table1.a = table2.a;
```

Weitere Informationen zu Verbundabfrageansichten finden Sie unter [Verbundansichten abfragen](running-federated-queries.md#running-federated-queries-federated-views).

# Athena-Ansichten verwalten
<a name="views-managing"></a>

In der Athena-Konsole stehen Ihnen folgende Funktionen zur Verfügung:
+ Zugriff auf alle Ansichten über den linken Bereich, in dem Tabellen aufgelistet sind. 
+ Filtern von Ansichten.
+ Ansichten in der Vorschau anzeigen, ihre Eigenschaften anzeigen, Ansichten bearbeiten oder löschen.

**So zeigen Sie die Aktionen für eine Ansicht an**

Eine Ansicht wird nur dann in der Konsole sichtbar, wenn Sie sie bereits erstellt haben.

1. Wählen Sie in der Athena-Konsole **Views** (Ansichten), und wählen Sie dann eine Ansicht aus, um sie zu erweitern und die Spalten in der Ansicht anzuzeigen.

1. Wählen Sie die drei vertikalen Punkte neben der Ansicht aus, um eine Liste von Aktionen für die Ansicht anzuzeigen.  
![\[Das Aktionsmenü für eine Ansicht.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/view-options.png)

1. Wählen Sie Aktionen aus, um eine Vorschau der Ansicht anzuzeigen, den Ansichtsnamen in den Abfrage-Editor einzufügen, die Ansicht zu löschen, die Eigenschaften der Ansicht anzuzeigen oder die Ansicht im Abfrage-Editor anzuzeigen und zu bearbeiten.

## Unterstützte DDL-Aktionen für Athena-Ansichten
<a name="views-supported-actions"></a>

Athena unterstützt die folgenden Management-Aktionen für Ansichten.


| Statement | Description | 
| --- | --- | 
| [CREATE VIEW und CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) |  Erstellt eine neue Ansicht aus einer angegebenen `SELECT`-Abfrage. Weitere Informationen finden Sie unter [Ansichten erstellen](views-console.md#creating-views). Mit der optionalen `OR REPLACE`-Klausel können Sie die vorhandene Ansicht aktualisieren, indem Sie sie ersetzen.  | 
| [DESCRIBE VIEW](describe-view.md) |  Zeigt die Liste der Spalten für die benannte Ansicht an. Auf diese Weise können Sie die Attribute einer komplexen Ansicht untersuchen.   | 
| [DROP VIEW](drop-view.md) |  Löscht eine vorhandene Ansicht. Mit der optionalen `IF EXISTS`-Klausel wird der Fehler unterdrückt, falls die Ansicht nicht existiert.  | 
| [SHOW CREATE VIEW](show-create-view.md) |  Zeigt die SQL-Anweisung an, die die angegebene Ansicht erstellt.  | 
| [SHOW VIEWS](show-views.md) |  Listet die Ansichten in der angegebenen Datenbank oder in der aktuellen Datenbank auf, wenn Sie den Datenbanknamen weglassen. Verwenden Sie die optionale `LIKE`-Klausel mit einem regulären Ausdruck, um die Liste der Ansichtsnamen einzugrenzen. Im linken Bereich der Konsole sehen Sie die Liste der Ansichten ebenfalls.  | 
| [SHOW COLUMNS](show-columns.md) |  Führt die Spalten im Schema für eine Ansicht auf.  | 

# Überlegungen und Einschränkungen für Athena-Ansichten
<a name="considerations-limitations-views"></a>

Athena-Ansichten unterliegen den folgenden Überlegungen und Einschränkungen.

## Überlegungen
<a name="considerations-views"></a>

Die folgenden Überlegungen beziehen sich auf das Erstellen und Verwenden von Ansichten in Athena:
+ In Athena können Sie Ansichten, die in der Athena-Konsole, in AWS Glue Data Catalog oder mit Presto auf dem Amazon EMR-Cluster, der mit demselben Katalog verbunden ist, erstellt wurden, in der Vorschau anzeigen und mit ihnen arbeiten.
+ Wenn Sie Athena-Ansichten im Datenkatalog erstellt haben, behandelt Ansichten als Tabellen. Sie können die feinkörnige Zugriffskontrolle auf Tabellenebene im Datenkatalog verwenden, um den [Zugriff auf diese Ansichten einzuschränken](fine-grained-access-to-glue-resources.md). 
+  Athena verhindert, dass Sie rekursive Ansichten ausführen, und zeigt in solchen Fällen eine Fehlermeldung an. Eine rekursive Ansicht ist eine Abfrage, die auf sich selbst verweist.
+ Athena zeigt eine Fehlermeldung an, wenn veraltete Ansichten erkannt werden. Eine veraltete Ansicht wird gemeldet, wenn eines der folgenden Ereignisse auftritt:
  + Die Ansicht verweist auf Tabellen oder Datenbanken, die nicht vorhanden sind.
  + Eine Schema- oder Metadatenänderung wird in einer referenzierten Tabelle vorgenommen. 
  + Eine referenzierte Tabelle wird gelöscht und mit einem anderen Schema oder einer anderen Konfiguration neu erstellt.
+ Sie können verschachtelte Ansichten erstellen und ausführen, solange die Abfrage hinter der verschachtelten Ansicht gültig ist und die Tabellen und Datenbanken vorhanden ist.

## Einschränkungen
<a name="limitations-views"></a>
+ Athena-Ansichtsnamen dürfen keine Sonderzeichen enthalten außer Unterstriche `(_)`. Weitere Informationen finden Sie unter [Namen für Datenbanken, Tabellen und Spalten](tables-databases-columns-names.md).
+ Vermeiden Sie reservierte Schlüsselwörter für die Benennung von Ansichten. Wenn Sie reservierte Schlüsselwörter verwenden, umschließen Sie sie in Ihren Abfragen in Ansichten mit doppelten Anführungszeichen. Siehe [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md).
+ Sie können in Athena erstellte Ansichten nicht mit externen Hive-Metastores oder verwenden. UDFs Weitere Informationen zum Arbeiten mit Ansichten, die extern in Hive erstellt wurden, finden Sie unter [Arbeiten mit Hive-Ansichten](hive-views.md).
+ Sie können keine Ansichten mit raumbezogenen Funktionen verwenden.
+ Sie können keine Ansichten zum Verwalten der Zugriffskontrolle auf Daten in Amazon S3 verwenden. Um eine Ansicht abzufragen, benötigen Sie Berechtigungen für den Zugriff auf die in Amazon S3 gespeicherten Daten. Weitere Informationen finden Sie unter [Zugriff auf Amazon S3 von Athena kontrollieren](s3-permissions.md).
+ Die kontenübergreifende Abfrage von Ansichten wird zwar sowohl in der Athena-Engine Version 3 unterstützt, Sie können jedoch keine Ansicht erstellen, die eine kontoübergreifende AWS Glue Data Catalog enthält. Informationen zum kontenübergreifenden Datenkatalog-Zugriff finden Sie unter [Kontenübergreifenden Zugriff auf AWS Glue Datenkataloge konfigurieren](security-iam-cross-account-glue-catalog-access.md).
+ Die versteckten Metadatenspalten `$bucket`, `$file_modified_time`, `$file_size` und `$partition` werden für Ansichten in Athena nicht unterstützt. Informationen zur Verwendung der `$path`-Metadatenspalte in Athena finden Sie unter [Abrufen der Dateispeicherorte für Quelldaten in Amazon S3](select.md#select-path).

# Datenkatalog-Ansichten in Athena verwenden
<a name="views-glue"></a>

Für die Erstellung von Datenkatalogansichten in Amazon Athena ist eine spezielle `CREATE VIEW`-Anweisung erforderlich. Ihre Abfrage verwendet die konventionelle SQL `SELECT`-Syntax. Datenkatalogansichten werden auch als Ansichten mit *mehreren Dialekten oder* bezeichnet. MDVs

## Erstellen einer Datenkatalog-Ansicht
<a name="views-glue-creating-a-data-catalog-view"></a>

Verwenden Sie die folgende Syntax, um eine Datenkatalog-Ansicht in Athena zu erstellen.

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS athena-sql-statement
```

**Anmerkung**  
Die `SHOW VIEW JSON`-Option gilt nur für Datenkatalogansichten und nicht für Athena-Ansichten. Bei Verwendung der `SHOW VIEW JSON`-Option wird ein „Testlauf“ durchgeführt, bei dem die Eingabe validiert wird. Wenn die Validierung erfolgreich ist, wird der JSON-Code des AWS Glue -Tabellenobjekts zurückgegeben, das die Ansicht darstellen wird. Die tatsächliche Ansicht wird nicht erstellt. Wenn die `SHOW VIEW JSON`-Option nicht angegeben ist, werden Validierungen durchgeführt und die Ansicht wird wie gewohnt im Datenkatalog erstellt.

Die folgende Beispielsyntax veranschaulicht, wie ein Benutzer der `Definer`-Rolle die Datenkatalog-Ansicht `orders_by_date` erstellt. Im Beispiel wird davon ausgegangen, dass die `Definer`-Rolle über vollständige `SELECT`-Berechtigungen für die `orders`-Tabelle in der `default`-Datenbank verfügt.

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

Weitere Informationen über Syntax finden Sie unter [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view).

## Abfrage einer Datenkatalog-Ansicht
<a name="views-glue-querying-a-data-catalog-view"></a>

Nachdem die Ansicht erstellt wurde, kann der `Lake Formation`-Admin `SELECT`-Berechtigungen für die Datenkatalog-Ansicht den `Invoker`Prinzipalen gewähren. Die `Invoker`-Prinzipale können dann die Ansicht abfragen, ohne Zugriff auf die zugrunde liegenden Basistabellen zu haben, auf die in der Ansicht verwiesen wird. Im Folgenden finden Sie ein Beispiel für eine `Invoker`-Abfrage.

```
SELECT * from orders_by_date where price > 5000
```

## Überlegungen und Einschränkungen
<a name="views-glue-limitations"></a>

Die meisten der folgenden Einschränkungen der Datenkatalogansicht sind spezifisch für Athena. Zusätzliche Einschränkungen für Datenkatalogansichten, die auch für andere Dienste gelten, finden Sie in der Dokumentation zu Lake Formation.
+ Datenkatalog-Ansichten können nicht auf andere Ansichten, Datenbankressourcen-Links oder Tabellenressourcen-Links verweisen.
+ Sie können in der Ansichtsdefinition auf bis zu 10 Tabellen verweisen.
+ Tabellen dürfen nicht über die `IAMAllowedPrincipals`-Data-Lake-Berechtigung in Lake Formation verfügen. Falls vorhanden, wird der Fehler Multi Dialect views may only referenziert auf Tabellen ohne IAMAllowed Principals-Berechtigungen.
+ Der Amazon-S3-Speicherort der Tabelle muss als Data-Lake-Speicherort registriert sein. Wenn die Tabelle nicht so registriert ist, tritt der Fehler Multi-Dialect-Ansichten dürfen nur auf von Lake Formation verwaltete Tabellen verweisen auf. Informationen zur Registrierung von Amazon-S3-Speicherorten in Lake Formation finden Sie unter [Registrierung eines Amazon-S3-Speicherorts](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html) im *AWS Lake Formation -Entwicklerhandbuch*.
+ Die [SearchTables](https://docs.aws.amazon.com/glue/latest/webapi/API_SearchTables.html)API-Aufrufe AWS Glue [GetTables](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTables.html)und aktualisieren den `IsRegisteredWithLakeFormation` Parameter nicht. Verwenden Sie die AWS Glue [GetTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTable.html)API, um den richtigen Wert für den Parameter anzuzeigen. Weitere Informationen finden Sie im *AWS Lake Formation Entwicklerhandbuch* unter [GetTables und aktualisieren SearchTables APIs Sie den Wert für den IsRegisteredWithLakeFormation Parameter nicht](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html#issue-GetTables-value).
+ Beim `DEFINER`-Prinzipal kann es sich nur um eine IAM-Rolle handeln.
+ Die `DEFINER`-Rolle muss über vollständige `SELECT`-Berechtigungen (gewährbar) für die zugrunde liegenden Tabellen verfügen.
+ `UNPROTECTED`-Data-Catalog-Ansichten werden nicht unterstützt.
+ Benutzerdefinierte Funktionen (UDFs) werden in der Viewdefinition nicht unterstützt.
+ Verbunddatenquellen von Athena können nicht in Data-Catalog-Ansichten verwendet werden.
+ Data-Catalog-Ansichten werden für externe Hive-Metastores nicht unterstützt.
+ Athena zeigt eine Fehlermeldung an, wenn veraltete Ansichten erkannt werden. Eine veraltete Ansicht wird gemeldet, wenn eines der folgenden Ereignisse auftritt:
  + Die Ansicht verweist auf Tabellen oder Datenbanken, die nicht vorhanden sind.
  + Eine Schema- oder Metadatenänderung wird in einer referenzierten Tabelle vorgenommen. 
  + Eine referenzierte Tabelle wird gelöscht und mit einem anderen Schema oder einer anderen Konfiguration neu erstellt.

## Berechtigungen
<a name="views-glue-permissions"></a>

Für Data-Catalog-Ansichten sind drei Rollen erforderlich: `Lake Formation Admin`, `Definer` und `Invoker`. 
+ **`Lake Formation Admin`** – Hat Zugriff auf die Konfiguration aller Lake-Formation-Berechtigungen.
+ **`Definer`** – Erstellt die Data-Catalog-Ansicht. Die `Definer`-Rolle muss über vollständige `SELECT`-Berechtigungen für alle zugrunde liegenden Tabellen verfügen, auf die die Ansichtsdefinition verweist.
+ **`Invoker`** – Kann die Data-Catalog-Ansicht abfragen oder deren Metadaten prüfen. Um den Aufrufer einer Abfrage anzuzeigen, können Sie die `invoker_principal()`-DML-Funktion verwenden. Weitere Informationen finden Sie unter [invoker\$1principal()](functions-env3.md#functions-env3-invoker-principal).

Die Vertrauensbeziehungen der `Definer` Rolle müssen die `sts:AssumeRole` Maßnahmen für die Dienstleiter AWS Glue und Lake Formation ermöglichen. Weitere Informationen finden Sie unter [Voraussetzungen für das Erstellen von Ansichten](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html#views-prereqs) im *AWS Lake Formation -Entwicklerhandbuch*.

Für den Athena-Zugriff sind außerdem IAM-Berechtigungen erforderlich. Weitere Informationen finden Sie unter [AWS verwaltete Richtlinien für Amazon Athena](security-iam-awsmanpol.md).

# Datenkatalog-Ansichten verwalten
<a name="views-glue-managing"></a>

Sie können DDL-Befehle verwenden, um Ihre Datenkatalogansichten zu aktualisieren und zu verwalten.

## Aktualisieren einer Datenkatalog-Ansicht
<a name="views-glue-updating-a-data-catalog-view"></a>

Der `Lake Formation`-Admin oder Definierer der die `ALTER VIEW UPDATE DIALECT`-Syntax verwenden, um die Ansichtsdefinition zu aktualisieren. Im folgenden Beispiel wird die Ansichtsdefinition so geändert, dass Spalten aus der `returns`-Tabelle statt aus der `orders`-Tabelle ausgewählt werden.

```
ALTER VIEW orders_by_date UPDATE DIALECT
AS
SELECT return_date, sum(totalprice) AS price
FROM returns
WHERE order_city = 'SEATTLE'
GROUP BY orderdate
```

## Unterstützte DDL-Aktionen für Views AWS Glue Data Catalog
<a name="views-glue-supported-actions"></a>

Athena unterstützt die folgenden Aktionen für AWS Glue Data Catalog Ansichten.


| Statement | Description | 
| --- | --- | 
| [ANSICHTSDIALEKT ÄNDERN](alter-view-dialect.md) |  Aktualisiert einen Datenkatalog, indem Sie entweder ein Engine-Dialekt hinzugefügt oder ein vorhandener Engine-Dialekt aktualisiert oder gelöscht wird.  | 
| [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view) |  Erstellt eine neue Datenkatalog-Ansicht aus einer angegebenen `SELECT`-Abfrage. Weitere Informationen finden Sie unter [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view). Mit der optionalen `OR REPLACE`-Klausel können Sie die vorhandene Ansicht aktualisieren, indem Sie sie ersetzen.  | 
| [DESCRIBE VIEW](describe-view.md) |  Zeigt die Liste der Spalten für die benannte Ansicht an. Auf diese Weise können Sie die Attribute einer komplexen Ansicht untersuchen.   | 
| [DROP VIEW](drop-view.md) |  Löscht eine vorhandene Ansicht. Mit der optionalen `IF EXISTS`-Klausel wird der Fehler unterdrückt, falls die Ansicht nicht existiert.  | 
| [SHOW CREATE VIEW](show-create-view.md) |  Zeigt die SQL-Anweisung an, die die angegebene Ansicht erstellt.  | 
| [SHOW VIEWS](show-views.md) |  Listet die Ansichten in der angegebenen Datenbank oder in der aktuellen Datenbank auf, wenn Sie den Datenbanknamen weglassen. Verwenden Sie die optionale `LIKE`-Klausel mit einem regulären Ausdruck, um die Liste der Ansichtsnamen einzugrenzen. Im linken Bereich der Konsole sehen Sie die Liste der Ansichten ebenfalls.  | 
| [SHOW COLUMNS](show-columns.md) |  Führt die Spalten im Schema für eine Ansicht auf.  | 

# Gespeicherte Abfragen verwenden
<a name="saved-queries"></a>

Sie können die Athena-Konsole verwenden, um die im Abfrage-Editor erstellten Abfragen zu speichern, zu bearbeiten, auszuführen, umzubenennen und zu löschen.

## Überlegungen und Einschränkungen
<a name="saved-queries-considerations-and-limitations"></a>
+ Sie können den Namen, die Beschreibung und den Abfragetext gespeicherter Abfragen aktualisieren.
+ Sie können die Abfragen nur in Ihrem eigenen Konto aktualisieren.
+ Sie können die Arbeitsgruppe oder Datenbank, zu der die Abfrage gehört, nicht ändern.
+ Athena speichert keinen Verlauf der Abfrageänderungen. Wenn Sie eine bestimmte Version einer Abfrage behalten möchten, speichern Sie sie unter einem anderen Namen.

**Anmerkung**  
Auf Amazon Athena Athena-Ressourcen kann jetzt in Amazon SageMaker Unified Studio (Preview) zugegriffen werden, sodass Sie auf die Daten Ihres Unternehmens zugreifen und mit den besten Tools darauf reagieren können. Sie können gespeicherte Abfragen von einer Athena-Arbeitsgruppe zu einem SageMaker Unified Studio-Projekt migrieren, Projekte mit vorhandenen Athena-Arbeitsgruppen konfigurieren und die erforderlichen Berechtigungen über IAM-Rollenaktualisierungen beibehalten. Weitere Informationen finden Sie unter [Migrieren von Amazon Athena Athena-Ressourcen zu Amazon SageMaker Unified Studio (Vorversion)](https://github.com/aws/Unified-Studio-for-Amazon-Sagemaker/tree/main/migration/athena).

**Topics**
+ [Überlegungen und Einschränkungen](#saved-queries-considerations-and-limitations)
+ [Eine Abfrage mit einem Namen speichern](saved-queries-name.md)
+ [Eine gespeicherte Abfrage ausführen](saved-queries-run.md)
+ [Eine gespeicherte Abfrage bearbeiten](saved-queries-edit.md)
+ [Eine gespeicherte Abfrage bearbeiten oder löschen](saved-queries-rename-or-delete.md)
+ [Benennen Sie eine nicht angezeigte gespeicherte Abfrage um](saved-queries-rename-not-displayed.md)
+ [Löschen einer nicht angezeigten gespeicherten Abfrage](saved-queries-delete-not-displayed.md)
+ [Verwenden der Athena-API zum Aktualisieren gespeicherter Abfragen](saved-queries-update-with-api.md)

# Eine Abfrage mit einem Namen speichern
<a name="saved-queries-name"></a>

**So speichern Sie eine Abfrage und geben ihr einen Namen**

1. Geben Sie im Athena-Abfrage-Editor eine Abfrage ein oder führen Sie eine Abfrage aus.

1. Wählen Sie über dem Fenster des Abfrage-Editors auf der Registerkarte für die Abfrage die drei vertikalen Punkte aus, und wählen Sie dann **Save as** (Speichern unter) aus.

1. Geben Sie im Dialogfeld **Save query** (Abfrage speichern) einen Namen für die Abfrage und eine optionale Beschreibung ein. Sie können das erweiterbare Fenster **Vorschau der SQL-Abfrage** verwenden, um den Inhalt der Abfrage zu überprüfen, bevor Sie sie speichern.

1. Wählen Sie **Save query** (Abfrage speichern).

   Im Abfrage-Editor zeigt die Registerkarte für die Abfrage den von Ihnen angegebenen Namen an.

# Eine gespeicherte Abfrage ausführen
<a name="saved-queries-run"></a>

**So führen Sie eine gespeicherte Abfrage aus**

1. Wählen Sie in der Athena-Konsole die Registerkarte **Saved queries** (Gespeicherte Abfragen) aus.

1. Wählen Sie in der Liste **Saved queries** (Gespeicherte Abfragen) die ID der Abfrage aus, die Sie ausführen möchten.

   Der Abfrage-Editor zeigt die von Ihnen gewählte Abfrage an.

1. Klicken Sie auf **Ausführen**.

# Eine gespeicherte Abfrage bearbeiten
<a name="saved-queries-edit"></a>

**So bearbeiten Sie eine gespeicherte Abfrage**

1. Wählen Sie in der Athena-Konsole die Registerkarte **Saved queries** (Gespeicherte Abfragen) aus.

1. Wählen Sie in der Liste **Saved queries** (Gespeicherte Abfragen) die ID der Abfrage aus, die Sie bearbeiten möchten.

1. Bearbeiten Sie die Abfrage im Abfrage-Editor.

1. Führen Sie einen der folgenden Schritte aus:
   + Wählen Sie dann **Run** (Ausführen) aus, um die Abfrage auszuführen.
   + Um die Abfrage zu speichern, wählen Sie die drei vertikalen Punkte auf der Registerkarte für die Abfrage aus, und wählen Sie dann **Save** (Speichern) aus.
   + Um die Abfrage unter einem anderen Namen zu speichern, wählen Sie die drei vertikalen Punkte auf der Registerkarte für die Abfrage aus, und wählen Sie dann **Save as** (Speichern unter) aus.

# Eine gespeicherte Abfrage bearbeiten oder löschen
<a name="saved-queries-rename-or-delete"></a>

**So benennen Sie eine bereits im Abfrage-Editor angezeigte gespeicherte Abfrage um oder löschen sie**

1. Wählen Sie die drei vertikalen Punkte auf der Registerkarte für die Abfrage aus, und wählen Sie dann **Rename** (Umbenennen) oder **Delete** (Löschen) aus.

1. Folgen Sie den Eingabeaufforderungen, um die Abfrage umzubenennen oder zu löschen.

# Benennen Sie eine nicht angezeigte gespeicherte Abfrage um
<a name="saved-queries-rename-not-displayed"></a>

**So benennen Sie eine gespeicherte Abfrage um, die nicht im Abfrage-Editor angezeigt wird**

1. Wählen Sie in der Athena-Konsole die Registerkarte **Saved queries** (Gespeicherte Abfragen) aus.

1. Aktivieren Sie das Kontrollkästchen für die Abfrage, die Sie umbenennen möchten.

1. Wählen Sie **Rename (Umbenennen)** aus.

1. Bearbeiten Sie im Dialogfeld **Rename query** (Abfrage umbenennen) den Abfragenamen und die Abfragebeschreibung. Sie können das erweiterbare Fenster **Vorschau der SQL-Abfrage** verwenden, um den Inhalt der Abfrage zu überprüfen, bevor Sie sie umbenennen.

1. Klicken Sie auf **Rename query** (Abfrage umbenennen).

   Die umbenannte Abfrage wird in der Liste **Saved queries** (Gespeicherte Abfragen) angezeigt.

# Löschen einer nicht angezeigten gespeicherten Abfrage
<a name="saved-queries-delete-not-displayed"></a>

**So löschen Sie eine gespeicherte Abfrage, die nicht im Abfrage-Editor angezeigt wird**

1. Wählen Sie in der Athena-Konsole die Registerkarte **Saved queries** (Gespeicherte Abfragen) aus.

1. Aktivieren Sie ein oder mehrere Kontrollkästchen der Abfragen, die Sie löschen möchten.

1. Wählen Sie **Löschen** aus.

1. Wählen Sie bei der Bestätigungsaufforderung **Delete** (Löschen) aus.

   Eine oder mehr Abfragen wird/werden aus der Liste **Saved queries** (Gespeicherte Abfragen) entfernt.

# Verwenden der Athena-API zum Aktualisieren gespeicherter Abfragen
<a name="saved-queries-update-with-api"></a>

Informationen zur Verwendung der Athena-API zum Aktualisieren einer gespeicherten Abfrage finden Sie unter der [UpdateNamedQuery](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateNamedQuery.html)Aktion in der Athena-API-Referenz.

# Parametrisierte Abfragen verwenden
<a name="querying-with-prepared-statements"></a>

Sie können parametrisierte Athena-Abfragen verwenden, um dieselbe Abfrage mit unterschiedlichen Parameterwerten zur Ausführungszeit erneut auszuführen und SQL-Injection-Angriffe zu verhindern. In Athena können parametrisierte Abfragen in beliebigen DML-Abfragen oder vorbereiteten SQL-Anweisungen die Form von Ausführungsparametern annehmen.
+ Abfragen mit Ausführungsparametern können in einem einzigen Schritt durchgeführt werden und sind nicht arbeitsgruppenspezifisch. Sie platzieren Fragezeichen in jeder DML-Abfrage für die Werte, die Sie parametrisieren möchten. Wenn Sie die Abfrage ausführen, deklarieren Sie die Werte der Ausführungsparameter sequenziell. Die Deklaration von Parametern und die Zuweisung von Werten für die Parameter können in derselben Abfrage erfolgen, jedoch entkoppelt. Im Gegensatz zu vorbereiteten Anweisungen können Sie die Arbeitsgruppe auswählen, wenn Sie eine Abfrage mit Ausführungsparametern senden.
+ Vorbereitete Anweisungen erfordern zwei separate SQL-Anweisungen: `PREPARE` und `EXECUTE`. Zunächst definieren Sie die Parameter in der `PREPARE`-Anweisung. Dann führen Sie eine `EXECUTE`-Anweisung aus, die Werte für die von Ihnen definierten Parameter bereitstellt. Vorbereitete Anweisungen sind arbeitsgruppenspezifisch. Sie können sie nicht außerhalb des Kontextes der Arbeitsgruppe, zu der sie gehören, ausführen.

## Überlegungen und Einschränkungen
<a name="querying-with-prepared-statements-considerations-and-limitations"></a>
+ Parametrisierte Abfragen werden in Athena-Engine-Version 2 und höheren Versionen unterstützt. Weitere Informationen über Athena-Engine-Versionen finden Sie unter [Athena-Engine-Versionierung](engine-versions.md).
+ Derzeit werden parametrisierte Abfragen nur für `SELECT`-, `INSERT INTO`-, `CTAS`- und `UNLOAD`-Anweisungen.
+ In parametrisierten Abfragen sind Parameter positionell und werden mit `?` angegeben. Parametern werden Werte nach ihrer Reihenfolge in der Abfrage zugewiesen. Benannte Parameter werden nicht unterstützt.
+ Derzeit können `?`-Parameter nur in der `WHERE`-Klausel platziert werden. Syntax wie `SELECT ? FROM table` wird nicht unterstützt.
+ Fragezeichen-Parameter können nicht in doppelte oder einfache Anführungszeichen gesetzt werden (d. h. `'?'` und `"?"` sind keine gültige Syntax).
+ Damit SQL-Ausführungsparameter als Zeichenfolgen behandelt werden, müssen sie in einfache Anführungszeichen und nicht in doppelte Anführungszeichen eingeschlossen werden.
+ Bei Bedarf können Sie die `CAST`-Funktion verwenden, wenn Sie einen Wert für einen parametrisierten Begriff eingeben. Wenn Sie beispielsweise über eine Spalte des `date`-Typs verfügen, den Sie in einer Abfrage parametrisiert haben, und Sie das Datum `2014-07-05` abfragen möchten, wird `CAST('2014-07-05' AS DATE)` bei Eingabe des Parameterwerts das Ergebnis zurückgegeben.
+ Vorbereitete Anweisungen sind arbeitsgruppenspezifisch und die Namen vorbereiteter Anweisungen müssen innerhalb der Arbeitsgruppe eindeutig sein.
+ IAM-Berechtigungen für vorbereitete Anweisungen sind erforderlich. Weitere Informationen finden Sie unter [Zugriff auf vorbereitete Anweisungen konfigurieren](security-iam-athena-prepared-statements.md).
+ Abfragen mit Ausführungsparametern in der Athena-Konsole sind auf maximal 25 Fragezeichen beschränkt.

**Topics**
+ [Überlegungen und Einschränkungen](#querying-with-prepared-statements-considerations-and-limitations)
+ [Ausführungsparameter verwenden](querying-with-prepared-statements-querying-using-execution-parameters.md)
+ [Vorbereitete Anweisungen verwenden](querying-with-prepared-statements-querying.md)
+ [Weitere Ressourcen](querying-with-prepared-statements-additional-resources.md)

# Ausführungsparameter verwenden
<a name="querying-with-prepared-statements-querying-using-execution-parameters"></a>

Sie können Fragezeichen-Platzhalter in jeder DML-Abfrage verwenden, um eine parametrisierte Abfrage zu erstellen, ohne zuerst eine vorbereitete Anweisung zu erstellen. Um diese Abfragen auszuführen, können Sie die Athena-Konsole oder das AWS CLI oder das AWS-SDK verwenden und die Variablen im `execution-parameters` Argument deklarieren.

**Topics**
+ [Athena-Konsole verwenden](querying-with-prepared-statements-running-queries-with-execution-parameters-in-the-athena-console.md)
+ [Verwenden Sie den AWS CLI](querying-with-prepared-statements-running-queries-with-execution-parameters-using-the-aws-cli.md)

# Ausführen von Abfragen mit Ausführungsparametern in der Athena-Konsole
<a name="querying-with-prepared-statements-running-queries-with-execution-parameters-in-the-athena-console"></a>

Wenn Sie eine parametrisierte Abfrage ausführen, die Ausführungsparameter (Fragezeichen) in der Athena-Konsole enthält, werden Sie aufgefordert, die Werte in der Reihenfolge einzugeben, in der die Fragezeichen in der Abfrage auftreten.

**So führen Sie eine Abfrage mit Ausführungsparametern aus**

1. Geben Sie im Athena-Editor eine Abfrage mit Fragezeichen-Platzhaltern ein, wie im folgenden Beispiel gezeigt.

   ```
   SELECT * FROM "my_database"."my_table"
   WHERE year = ? and month= ? and day= ?
   ```

1. Klicken Sie auf **Ausführen**.

1. In dem Dialogfeld **Enter parameters** (Parameter eingeben) geben Sie für jedes der Fragezeichen in der Abfrage einen Wert in der richtigen Reihenfolge ein.  
![\[Geben Sie nacheinander Werte für die Abfrageparameter ein\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-with-prepared-statements-1.png)

1. Wenn Sie alle Parameter eingegeben haben, wählen Sie **Run** (Ausführen) aus. Der Editor zeigt die Abfrageergebnisse für die von Ihnen eingegebenen Parameterwerte an.

Jetzt können Sie einen der folgenden Schritte ausführen:
+ Geben Sie verschiedene Parameterwerte für dieselbe Abfrage ein und wählen Sie anschließend **Run again** (Erneut ausführen) aus.
+ Um alle Werte, die Sie eingegeben haben, gleichzeitig zu löschen, wählen Sie **Clear** (Löschen) aus.
+ Um die Abfrage direkt zu bearbeiten (z. B. um Fragezeichen hinzuzufügen oder zu entfernen), schließen Sie zunächst das Dialogfeld **Enter parameters** (Parameter eingeben).
+ Um die parametrisierte Abfrage für eine spätere Verwendung zu speichern, wählen Sie **Save** (Speichern) oder **Save as** (Speichern als) aus und geben Sie der Abfrage dann einen Namen. Weitere Informationen zur Verwendung von gespeicherten Abfragen finden Sie unter [Gespeicherte Abfragen verwenden](saved-queries.md).

Als Annehmlichkeit merkt sich das Dialogfeld **Enter parameters** (Parameter eingeben) die Werte, die Sie zuvor für die Abfrage eingegeben haben, solange Sie dieselbe Registerkarte im Abfrage-Editor verwenden.

# Führen Sie Abfragen mit Ausführungsparametern mit dem AWS CLI
<a name="querying-with-prepared-statements-running-queries-with-execution-parameters-using-the-aws-cli"></a>

Um Abfragen mit Ausführungsparametern auszuführen, verwenden Sie den `start-query-execution` Befehl und geben Sie im Argument eine parametrisierte Abfrage an`query-string`. AWS CLI Geben Sie daraufhin im `execution-parameters`-Argument die Werte für die Ausführungsparameter an. Das folgende Beispiel illustriert diese Technik.

```
aws athena start-query-execution 
--query-string "SELECT * FROM table WHERE x = ? AND y = ?"
--query-execution-context "Database"="default" 
--result-configuration "OutputLocation"="s3://amzn-s3-demo-bucket;/..."
--execution-parameters "1" "2"
```

# Vorbereitete Anweisungen verwenden
<a name="querying-with-prepared-statements-querying"></a>

Sie können eine vorbereitete Anweisung für die wiederholte Ausführung derselben Abfrage mit unterschiedlichen Abfrageparametern verwenden. Eine vorbereitete Anweisung enthält Parameterplatzhalter, deren Werte zur Ausführungszeit angegeben werden.

**Anmerkung**  
Die maximale Anzahl vorbereiteter Anweisungen in einer Arbeitsgruppe beträgt 1 000.

**Topics**
+ [SQL-Syntax](querying-with-prepared-statements-sql-statements.md)
+ [Athena-Konsole verwenden](querying-with-prepared-statements-executing-prepared-statements-without-the-using-clause-athena-console.md)
+ [Verwenden Sie den AWS CLI](querying-with-prepared-statements-cli-section.md)

# SQL-Syntax für vorbereitete Anweisungen
<a name="querying-with-prepared-statements-sql-statements"></a>

Sie können die SQL-Anweisungen `PREPARE`, `EXECUTE` und `DEALLOCATE PREPARE` verwenden, um parametrisierte Abfragen im Abfrage-Editor der Athena-Konsole auszuführen. 

 
+ Um Parameter anzugeben, bei denen Sie normalerweise Literalwerte verwenden würden, verwenden Sie Fragezeichen in der `PREPARE`-Anweisung.
+ Um die Parameter beim Ausführen der Abfrage durch Werte zu ersetzen, verwenden Sie die `USING`-Klausel in der `EXECUTE`-Anweisung.
+ Um eine vorbereitete Anweisung aus den vorbereiteten Anweisungen in einer Arbeitsgruppe zu entfernen, verwenden Sie die `DEALLOCATE PREPARE`-Anweisung.

Die folgenden Abschnitte enthalten zusätzliche Details zu jeder dieser Aussagen.

**Topics**
+ [PREPARE](querying-with-prepared-statements-prepare.md)
+ [EXECUTE](querying-with-prepared-statements-execute.md)
+ [DEALLOCATE PREPARE](querying-with-prepared-statements-deallocate-prepare.md)

# PREPARE
<a name="querying-with-prepared-statements-prepare"></a>

Bereitet eine Anweisung vor, die zu einem späteren Zeitpunkt ausgeführt werden soll. Vorbereitete Anweisungen werden in der aktuellen Arbeitsgruppe mit dem von Ihnen angegebenen Namen gespeichert. Die Anweisung kann Parameter anstelle von Literalen enthalten, die beim Ausführen der Abfrage ersetzt werden sollen. Parameter, die durch Werte ersetzt werden sollen, werden durch Fragezeichen gekennzeichnet.

## Syntax
<a name="querying-with-prepared-statements-prepare-syntax"></a>

```
PREPARE statement_name FROM statement
```

In der Tabelle unten werden diese Parameter beschrieben.


****  

| Parameter | Description | 
| --- | --- | 
| statement\$1name | Der Name der zu erstellenden Anweisung. Der Name muss innerhalb der Arbeitsgruppe eindeutig sein. | 
| statement | SELECT-, CTAS- oder INSERT INTO-Abfrage. | 

## PREPARE-Beispiele
<a name="querying-with-prepared-statements-prepare-examples"></a>

Die folgenden Beispiele zeigen die Verwendung der `PREPARE`-Anweisung. Fragezeichen kennzeichnen die Werte, die von der `EXECUTE`-Anweisung beim Ausführen der Abfrage geliefert werden sollen.

```
PREPARE my_select1 FROM
SELECT * FROM nation
```

```
PREPARE my_select2 FROM
SELECT * FROM "my_database"."my_table" WHERE year = ?
```

```
PREPARE my_select3 FROM
SELECT order FROM orders WHERE productid = ? and quantity < ?
```

```
PREPARE my_insert FROM
INSERT INTO cities_usa (city, state)
SELECT city, state
FROM cities_world
WHERE country = ?
```

```
PREPARE my_unload FROM
UNLOAD (SELECT * FROM table1 WHERE productid < ?)
TO 's3://amzn-s3-demo-bucket/'
WITH (format='PARQUET')
```

# EXECUTE
<a name="querying-with-prepared-statements-execute"></a>

Führt eine vorbereitete Anweisung aus. Werte für Parameter werden in der `USING`-Klausel angegeben.

## Syntax
<a name="querying-with-prepared-statements-execute-syntax"></a>

```
EXECUTE statement_name [USING value1 [ ,value2, ... ] ]
```

*statement\$1name*ist der Name der vorbereiteten Anweisung. *value1*und *value2* sind die Werte, die für die Parameter in der Anweisung angegeben werden müssen.

## EXECUTE-Beispiele
<a name="querying-with-prepared-statements-execute-examples"></a>

Im folgenden Beispiel wird die vorbereitete Anweisung `my_select1` ausgeführt, die keine Parameter enthält.

```
EXECUTE my_select1
```

Im folgenden Beispiel wird die vorbereitete Anweisung `my_select2` ausgeführt, die einen einzelnen Parameter enthält.

```
EXECUTE my_select2 USING 2012
```

Im folgenden Beispiel wird die vorbereitete Anweisung `my_select3` ausgeführt, die über zwei Parameter verfügt.

```
EXECUTE my_select3 USING 346078, 12
```

Das folgende Beispiel liefert einen Zeichenfolgenwert für einen Parameter in der vorbereiteten Anweisung `my_insert`.

```
EXECUTE my_insert USING 'usa'
```

Das folgende Beispiel liefert einen Zahlenwert für den `productid`-Parameter in der vorbereiteten Anweisung `my_unload`.

```
EXECUTE my_unload USING 12
```

# DEALLOCATE PREPARE
<a name="querying-with-prepared-statements-deallocate-prepare"></a>

Entfernt die vorbereitete Anweisung mit dem angegebenen Namen aus der Liste der vorbereiteten Anweisungen in der aktuellen Arbeitsgruppe.

## Syntax
<a name="querying-with-prepared-statements-deallocate-prepare-syntax"></a>

```
DEALLOCATE PREPARE statement_name
```

*statement\$1name*ist der Name der vorbereiteten Anweisung, die entfernt werden soll.

## Beispiel
<a name="querying-with-prepared-statements-deallocate-prepare-examples"></a>

Im folgenden Beispiel wird die vorbereitete Anweisung `my_select1` aus der aktuellen Arbeitsgruppe entfernt.

```
DEALLOCATE PREPARE my_select1
```

# Interaktive vorbereitete Anweisungen in der Athena-Konsole ausführen
<a name="querying-with-prepared-statements-executing-prepared-statements-without-the-using-clause-athena-console"></a>

Wenn Sie eine bestehende vorbereitete Anweisung mit der Syntax `EXECUTE` *prepared\$1statement* im Abfrage-Editor ausführen, öffnet Athena das Dialogfeld „**Parameter eingeben**“, sodass Sie die Werte eingeben können, die normalerweise in der `USING` Klausel der `EXECUTE ... USING` Anweisung enthalten wären.

**So führen Sie eine vorbereitete Anweisung mit dem Dialogfeld **Enter parameters** (Parameter eingeben) aus**

1. Verwenden Sie im Abfrage-Editor statt der Syntax `EXECUTE prepared_statement USING` *value1* `,` *value2* ` ...` die Syntax `EXECUTE`*prepared\$1statement*.

1. Klicken Sie auf **Ausführen**. Das Dialogfeld **Enter parameters** (Parameter eingeben) wird angezeigt.  
![\[Geben Sie die Parameter für eine vorbereitete Anweisung in der Athena-Konsole ein.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-with-prepared-statements-2.png)

1. Geben Sie die Werte der Reihe nach in das Dialogfeld **Execution parameters** (Ausführungsparameter) ein. Da der Originaltext der Abfrage nicht sichtbar ist, müssen Sie sich an die Bedeutung der einzelnen Positionsparameter erinnern oder die vorbereitete Anweisung als Referenz zur Verfügung haben.

1. Klicken Sie auf **Ausführen**.

# Verwenden Sie die, AWS CLI um vorbereitete Anweisungen zu erstellen, auszuführen und aufzulisten
<a name="querying-with-prepared-statements-cli-section"></a>

Sie können den verwenden, AWS CLI um vorbereitete Anweisungen zu erstellen, auszuführen und aufzulisten.

**Topics**
+ [Create](querying-with-prepared-statements-creating-prepared-statements-using-the-aws-cli.md)
+ [Execute](querying-with-prepared-statements-cli-executing-prepared-statements.md)
+ [Auflisten](querying-with-prepared-statements-listing.md)

# Erstellen Sie vorbereitete Anweisungen mit dem AWS CLI
<a name="querying-with-prepared-statements-creating-prepared-statements-using-the-aws-cli"></a>

Um eine vorbereitete Anweisung AWS CLI zu erstellen, können Sie einen der folgenden `athena` Befehle verwenden:
+ Verwenden Sie den `create-prepared-statement`-Befehl und geben Sie eine Abfrageanweisung mit Ausführungsparametern an.
+ Verwenden Sie den `start-query-execution`-Befehl und geben Sie eine Abfragezeichenfolge an, die die `PREPARE`-Syntax verwendet.

## Verwenden create-prepared-statement
<a name="querying-with-prepared-statements-cli-using-create-prepared-statement"></a>

Definieren Sie in einem `create-prepared-statement`-Befehl den Abfragetext im `query-statement`-Argument, wie im folgenden Beispiel.

```
aws athena create-prepared-statement 
--statement-name PreparedStatement1 
--query-statement "SELECT * FROM table WHERE x = ?" 
--work-group athena-engine-v2
```

## Verwenden Sie start-query-execution und die PREPARE-Syntax
<a name="querying-with-prepared-statements-cli-using-start-query-execution-and-the-prepare-syntax"></a>

Verwenden Sie den Befehl `start-query-execution`. Setzen Sie die `PREPARE`-Anweisung in das `query-string`-Argument, wie im folgenden Beispiel gezeigt:

```
aws athena start-query-execution 
--query-string "PREPARE PreparedStatement1 FROM SELECT * FROM table WHERE x = ?" 
--query-execution-context '{"Database": "default"}' 
--result-configuration '{"OutputLocation": "s3://amzn-s3-demo-bucket/..."}'
```

# Führen Sie vorbereitete Anweisungen mit dem aus AWS CLI
<a name="querying-with-prepared-statements-cli-executing-prepared-statements"></a>

Um eine vorbereitete Anweisung mit dem auszuführen AWS CLI, können Sie Werte für die Parameter angeben, indem Sie eine der folgenden Methoden verwenden:
+ Verwenden Sie das `execution-parameters`-Argument.
+ Verwenden Sie die `EXECUTE ... USING`-SQL-Syntax im `query-string`-Argument.

## Verwenden sie das Argument execution-parameters
<a name="querying-with-prepared-statements-cli-using-the-execution-parameters-argument"></a>

Bei diesem Ansatz verwenden Sie den `start-query-execution`-Befehl und geben den Namen einer vorhandenen vorbereiteten Anweisung im `query-string`-Argument ein. Geben Sie daraufhin im `execution-parameters`-Argument die Werte für die Ausführungsparameter an. Die folgende Beispielrichtlinie zeigt diese Methode.

```
aws athena start-query-execution 
--query-string "Execute PreparedStatement1" 
--query-execution-context "Database"="default" 
--result-configuration "OutputLocation"="s3://amzn-s3-demo-bucket/..."
--execution-parameters "1" "2"
```

## Verwenden von EXECUTE... VERWENDEN der SQL-Syntax
<a name="querying-with-prepared-statements-cli-using-the-execute-using-sql-syntax"></a>

Um eine vorhandene vorbereitete Anweisung mithilfe der `EXECUTE ... USING`-Syntax auszuführen, verwenden Sie den `start-query-execution`-Befehl und platzieren sowohl den Namen der vorbereiteten Anweisung als auch die Parameterwerte in das `query-string`-Argument, wie im folgenden Beispiel:

```
aws athena start-query-execution 
--query-string "EXECUTE PreparedStatement1 USING 1"
--query-execution-context '{"Database": "default"}' 
--result-configuration '{"OutputLocation": "s3://amzn-s3-demo-bucket/..."}'
```

# Listet vorbereitete Anweisungen auf, indem Sie AWS CLI
<a name="querying-with-prepared-statements-listing"></a>

Um die vorbereiteten Anweisungen für eine bestimmte Arbeitsgruppe aufzulisten, können Sie den [list-prepared-statements](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/list-prepared-statements.html) AWS CLI Befehl Athena oder die [ListPreparedStatements](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListPreparedStatements.html)Athena-API-Aktion verwenden. Der Parameter `--work-group` muss angegeben werden.

```
aws athena list-prepared-statements --work-group primary
```

# Weitere Ressourcen
<a name="querying-with-prepared-statements-additional-resources"></a>

Lesen Sie die folgenden verwandten Beiträge im AWS Big Data-Blog.
+ [Die Wiederverwendbarkeit und Sicherheit mithilfe von in Amazon Athena parametrisierten Abfragen verbessern](https://aws.amazon.com/blogs/big-data/improve-reusability-and-security-using-amazon-athena-parameterized-queries/) 
+ [In Amazon Athena parametrisierte Abfragen verwenden, um Daten als Service bereitzustellen](https://aws.amazon.com/blogs/big-data/use-amazon-athena-parameterized-queries-to-provide-data-as-a-service/) 

# Kostenbasierten Optimierer verwenden
<a name="cost-based-optimizer"></a>

Sie können das CBO-Feature (Kostenbasierter Optimierer) in Athena SQL verwenden, um Ihre Abfragen zu optimieren. Sie können optional anfordern, dass Athena Statistiken auf Tabellen- oder Spaltenebene für eine Ihrer Tabellen in AWS Glue sammelt. Wenn alle Tabellen in Ihrer Abfrage Statistiken enthalten, verwendet Athena die Statistiken, um einen Ausführungsplan zu erstellen, den es für den leistungsfähigsten hält. Der Abfrageoptimierer berechnet alternative Pläne auf der Grundlage eines statistischen Modells und wählt dann den Plan aus, mit dem die Abfrage wahrscheinlich am schnellsten ausgeführt werden kann.

Statistiken zu AWS Glue Tabellen werden gesammelt und gespeichert und Athena zur Verfügung gestellt, um die AWS Glue Data Catalog Planung und Ausführung von Abfragen zu verbessern. Bei diesen Statistiken handelt es sich um Statistiken auf Spaltenebene, z. B. die Anzahl der eindeutigen Werte, die Anzahl der Nullwerte, Maximal- und Minimalwerte für Dateitypen wie Parquet, ORC, JSON, ION, CSV und XML. Amazon Athena verwendet diese Statistiken, um Abfragen zu optimieren, indem die restriktivsten Filter so früh wie möglich bei der Abfrageverarbeitung angewendet werden. Diese Filterung begrenzt die Speichernutzung und die Anzahl der Datensätze, die gelesen werden müssen, um die Abfrageergebnisse zu liefern.

In Verbindung mit CBO verwendet Athena ein Feature, das als regelbasierter Optimierer (RBO) bezeichnet wird. RBO wendet mechanisch Regeln an, von denen erwartet wird, dass sie die Abfrageleistung verbessern. RBO ist im Allgemeinen vorteilhaft, da seine Transformationen darauf abzielen, den Abfrageplan zu vereinfachen. Da RBO jedoch keine Kostenberechnungen oder Planvergleiche durchführt, erschweren kompliziertere Abfragen es RBO, einen optimalen Plan zu erstellen.

Aus diesem Grund verwendet Athena sowohl RBO als auch CBO, um Ihre Abfragen zu optimieren. Nachdem Athena Möglichkeiten zur Verbesserung der Abfrageausführung identifiziert hat, erstellt es einen optimalen Plan. Informationen zu Ausführungsplandetails finden Sie unter [Anzeigen von Ausführungsplänen für SQL-Abfragen](query-plans.md). Eine ausführliche Erläuterung der Funktionsweise von CBO finden Sie unter [Abfragen mit dem kostenbasierten Optimierer in Amazon Athena beschleunigen](https://aws.amazon.com/blogs/big-data/speed-up-queries-with-cost-based-optimizer-in-amazon-athena/) im AWS -Big-Data-Blogbeitrag.

Um Statistiken für AWS Glue Katalogtabellen zu generieren, können Sie die Athena-Konsole, die AWS Glue Konsole oder AWS Glue APIs verwenden. Da Athena in AWS Glue Catalog integriert ist, erhalten Sie automatisch die entsprechenden Verbesserungen der Abfrageleistung, wenn Sie Abfragen von Amazon Athena ausführen.

## Überlegungen und Einschränkungen
<a name="cost-based-optimizer-considerations-and-limitations"></a>
+ **Tabellentypen** – Derzeit unterstützt das CBO-Feature in Athena nur Hive- und Iceberg-Tabellen, die sich in AWS Glue Data Catalog befinden.
+ **Athena for Spark** – Das CBO-Feature ist in Athena for Spark nicht verfügbar.
+ **Preise** – Informationen zur Preisgestaltung finden Sie auf der [AWS Glue -Preisseite](https://aws.amazon.com/glue/pricing).

## Tabellenstatistiken mit der Athena-Konsole generieren
<a name="cost-based-optimizer-generating-table-statistics-using-the-athena-console"></a>

In diesem Abschnitt wird beschrieben, wie Sie mit der Athena-Konsole Statistiken auf Tabellen- oder Spaltenebene für eine Tabelle in AWS Glue generieren. Informationen AWS Glue zur Generierung von Tabellenstatistiken finden Sie unter [Arbeiten mit Spaltenstatistiken](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html) im *AWS Glue Entwicklerhandbuch*.

**So generieren Sie Tabellenstatistiken mit der Athena-Konsole**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Wählen Sie in der **Tabellenliste** des Athena-Abfrageeditors die drei vertikalen Punkte für die gewünschte Tabelle aus, und wählen Sie dann **Statistik generieren** aus.  
![\[Kontextmenü für eine Tabelle im Athena-Abfrageeditor.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cost-based-optimizer-1.png)

1. Wählen Sie im Dialogfeld **Statistik generieren** die Option **Alle Spalten**, um Statistiken für alle Spalten in der Tabelle zu generieren, oder wählen Sie **Ausgewählte Spalten**, um bestimmte Spalten auszuwählen. Der Standardwert ist **Alle Spalten**.  
![\[Das Dialogfeld „Statistiken generieren“.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cost-based-optimizer-2.png)

1. Erstellen Sie für die **AWS Glue Servicerolle** eine vorhandene Servicerolle oder wählen Sie eine aus, um die Erlaubnis zum Generieren von Statistiken AWS Glue zu erteilen. Die AWS Glue -Servicerolle erfordert außerdem [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)-Berechtigungen für den Amazon-S3-Bucket, der die Daten der Tabelle enthält.  
![\[Wählen Sie eine AWS Glue Servicerolle.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cost-based-optimizer-3.png)

1. Wählen Sie **Statistik generieren**. Ein Banner zum **Generieren von Statistiken für *table\$1name*** Benachrichtigungen zeigt den Status der Aufgabe an.  
![\[Das Benachrichtigungsbanner beim Generieren von Statistiken.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cost-based-optimizer-4.png)

1. Um Details in der AWS Glue Konsole anzuzeigen, wählen Sie **In Glue anzeigen**. 

   Informationen zum Anzeigen von Statistiken in der AWS Glue Konsole finden Sie unter [Spaltenstatistiken anzeigen](https://docs.aws.amazon.com/glue/latest/dg/view-column-stats.html) im *AWS Glue Entwicklerhandbuch*. 

1. Nach der Generierung der Statistiken wird in den Tabellen und Spalten mit Statistiken das Wort **Statistik** in Klammern angezeigt, wie in der folgenden Abbildung.  
![\[Eine Tabelle mit Statistiksymbolen im Athena-Abfrageeditor.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cost-based-optimizer-5.png)

Wenn Sie jetzt Ihre Abfragen ausführen, führt Athena eine kostenbasierte Optimierung der Tabellen und Spalten durch, für die Statistiken generiert wurden.

## Tabellenstatistiken aktivieren und deaktivieren
<a name="cost-based-optimizer-enabling-iceberg-table-statistics"></a>

Wenn Sie Tabellenstatistiken für eine Iceberg-Tabelle gemäß den Schritten im vorherigen Abschnitt generieren, `use_iceberg_statistics` wird der Iceberg-Tabelle in automatisch eine Glue-Tabelleneigenschaft mit dem Namen Glue hinzugefügt AWS Glue Data Catalog und standardmäßig auf **true** gesetzt. Wenn Sie diese Eigenschaft entfernen oder auf **false** setzen, verwendet CBO die Iceberg-Tabellenstatistiken nicht, wenn versucht wird, den Abfrageplan während der Abfrageausführung zu optimieren, auch wenn die Statistiken von Glue generiert wurden. Weitere Informationen zum Generieren von Tabellenstatistiken finden Sie unter [Tabellenstatistiken mit der Athena-Konsole generieren](#cost-based-optimizer-generating-table-statistics-using-the-athena-console).

Im Gegensatz dazu verfügen Hive-Tabellen im Glue-Datenkatalog nicht über eine ähnliche Tabelleneigenschaft, um die Verwendung von Tabellenstatistiken für CBO zu aktivieren oder zu deaktivieren. Daher verwendet CBO immer die von Glue generierten Tabellenstatistiken, wenn es darum geht, den Abfrageplan für Hive-Tabellen zu optimieren. 

## Weitere Ressourcen
<a name="cost-based-optimizer-additional-resources"></a>

Weitere Informationen finden Sie in der folgenden Ressource.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R)


# Abfragen von Daten der S3 Express One Zone
<a name="querying-express-one-zone"></a>

Die Speicherklasse der Amazon S3 Express One Zone ist eine hochleistungsfähige Amazon-S3-Speicherklasse, die Reaktionszeiten im einstelligen Millisekundenbereich bietet. Daher ist dies für Anwendungen nützlich, die häufig mit Hunderttausenden Anfragen pro Sekunde auf Daten zugreifen.

S3 Express One Zone repliziert und speichert Daten innerhalb derselben Availability Zone, um Geschwindigkeit und Kosten zu optimieren. Dies unterscheidet sich von den regionalen Speicherklassen von Amazon S3, bei denen Daten automatisch über mindestens drei AWS Availability Zones innerhalb einer AWS-Region repliziert werden.

Weitere Informationen finden Sie unter [Was ist S3 Express One Zone?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html) im *Amazon-S3-Benutzerhandbuch*.

## Voraussetzungen
<a name="querying-express-one-zone-prerequisites"></a>

Stellen Sie sicher, dass die folgenden Bedingungen erfüllt sind, bevor Sie beginnen:
+ **Athena-Engine-Version 3** – Um S3 Express One Zone mit Athena SQL zu verwenden, muss Ihre Arbeitsgruppe für die Verwendung der Athena-Engine-Version 3, konfiguriert sein.
+ **Berechtigungen für S3 Express One Zone** – Wenn S3 Express One Zone eine Aktion wie `GET`, `LIST` oder `PUT` für ein Amazon-S3-Objekt aufruft, ruft die Speicherklasse `CreateSession` in Ihrem Namen auf. Aus diesem Grund muss Ihre IAM-Richtlinie die `s3express:CreateSession`-Aktion zulassen, wodurch Athena den entsprechenden API-Vorgang aufrufen kann.

## Überlegungen und Einschränkungen
<a name="querying-express-one-zone-considerations-and-limitations"></a>

Berücksichtigen Sie bei der Abfrage von S3 Express One Zone mit Athena die folgenden Punkte. 
+ Buckets der S3 Express One Zone unterstützen nur `SSE_S3`- und `SSE-KMS`-Verschlüsselung. Athena-Abfrageergebnisse werden mithilfe der `SSE_S3`-Verschlüsselung geschrieben, unabhängig von der Option, die Sie in den Arbeitsgruppeneinstellungen zum Verschlüsseln der Abfrageergebnisse auswählen. Diese Einschränkung gilt für alle Szenarien, in denen Athena Daten in Buckets der S3 Express One Zone schreibt, einschließlich `CREATE TABLE AS`- (CTAS) und `INSERT INTO`-Anweisungen.
+ Der AWS Glue Crawler wird für die Erstellung von Tabellen mit S3 Express One Zone-Daten nicht unterstützt.
+ Die `MSCK REPAIR TABLE`-Anweisung wird nicht unterstützt. Als Problemumgehung verwenden Sie [ALTER TABLE ADD PARTITION](alter-table-add-partition.md).
+ Für S3 Express One Zone werden keine DDL-Anweisungen zur Tabellenänderung für Apache Iceberg unterstützt (d. h. keine `ALTER TABLE`-Anweisungen).
+ Lake Formation wird von S3 Express One Zone nicht unterstützt.
+ Die folgenden Datei- und Tabellenformate werden nicht oder nur eingeschränkt unterstützt. Wenn Formate nicht aufgeführt sind, aber für Athena unterstützt werden (z. B. Parquet, ORC und JSON), werden sie auch für die Verwendung mit Speicher der S3 Express One Zone unterstützt.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/querying-express-one-zone.html)

## Erste Schritte
<a name="querying-express-one-zone-getting-started"></a>

Das Abfragen von Daten der S3 Express One Zone mit Athena ist unkompliziert. Führen Sie zunächst die folgenden Schritte aus.

**So verwenden Sie Athena SQL zum Abfragen von Daten der S3 Express One Zone**

1. Übertragen Sie Ihre Daten auf Speicher der S3 Express One Zone. Weitere Informationen finden Sie unter [Festlegen der Speicherklasse eines Objekts](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-howtoset) im *Amazon-S3-Benutzerhandbuch*.

1. Verwenden Sie eine [CREATE TABLE](create-table.md)-Anweisung in Athena, um Ihre Daten in AWS Glue Data Catalog zu katalogisieren. Informationen zum Erstellen von Tabellen in Athena finden Sie unter [Erstellen von Tabellen in Athena](creating-tables.md) und der [CREATE TABLE](create-table.md)-Anweisung.

1. (Optional) Konfigurieren Sie den Speicherort der Abfrageergebnisse Ihrer Athena-Arbeitsgruppe für die Verwendung eines *Verzeichnis-Buckets* von Amazon S3. Amazon-S3-Verzeichnis-Buckets sind leistungsfähiger als allgemeine Buckets und wurden für Workloads oder leistungskritische Anwendungen entwickelt, die eine konstante Latenzzeit im einstelligen Millisekundenbereich erfordern. Weitere Informationen finden Sie unter [Übersicht über Verzeichnis-Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html) im *Amazon-S3-Benutzerhandbuch*.

# Wiederhergestellte Amazon-Glacier-Objekte abfragen
<a name="querying-glacier"></a>

Mit Athena können Sie wiederhergestellte Objekte aus den [Amazon S3-Speicherklassen](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier) Amazon Glacier Flexible Retrieval (ehemals Glacier) und Amazon Glacier Deep Archive abfragen. Sie müssen diese Funktion für jede Tabelle aktivieren. Wenn Sie das Feature nicht für eine Tabelle aktivieren, bevor Sie eine Abfrage ausführen, überspringt Athena während der Abfrageausführung alle Objekte der Tabelle von Amazon Glacier Flexible Retrieval und Amazon Glacier Deep Archive. 

## Überlegungen und Einschränkungen
<a name="querying-glacier-considerations-and-limitations"></a>
+  Die Abfrage wiederhergestellter Amazon-Glacier-Objekte wird nur auf der Athena-Engine-Version 3 unterstützt. 
+  Das Feature wird nur für Apache-Hive-Tabellen unterstützt. 
+  Sie müssen Ihre Objekte wiederherstellen, bevor Sie Ihre Daten abfragen; Athena stellt keine Objekte für Sie wieder her. 

## Konfiguration einer Tabelle für die Verwendung wiederhergestellter Objekte
<a name="querying-glacier-configuring-a-table-to-use-restored-objects"></a>

 Um Ihre Athena-Tabelle so zu konfigurieren, dass sie wiederhergestellte Objekte in Ihre Abfragen einbezieht, müssen Sie ihre `read_restored_glacier_objects`-Tabelleneigenschaft auf `true` setzen. Dazu können Sie den Athena-Abfrageeditor oder die AWS Glue Konsole verwenden. Sie können aber auch die [AWS Glue -CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/update-table.html), die [AWS Glue -API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-UpdateTable) oder das [AWS Glue -SDK](https://docs.aws.amazon.com/glue/latest/dg/sdk-general-information-section.html). verwenden. 

### Athena-Abfrage-Editor verwenden
<a name="querying-glacier-using-the-athena-query-editor"></a>

 In Athena können Sie den [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) Befehl verwenden, um die Tabelleneigenschaft festzulegen, wie im folgenden Beispiel. 

```
ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'true')
```

### Verwenden Sie die Konsole AWS Glue
<a name="querying-glacier-using-the-aws-glue-console"></a>

 Führen Sie in der AWS Glue Konsole die folgenden Schritte aus, um die `read_restored_glacier_objects` Tabelleneigenschaft hinzuzufügen. 

**Um Tabelleneigenschaften in der AWS Glue Konsole zu konfigurieren**

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. Führen Sie eine der folgenden Aktionen aus:
   + Wählen Sie **Zu Data Catalog gehen**.
   + Wählen Sie im Navigationsbereich die Option **Data-Catalog-Tabellen**.

1. Wählen Sie auf der Seite **Tabellen** in der Liste der Tabellen den Link zu der Tabelle, die Sie bearbeiten möchten.

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

1. Fügen Sie auf der Seite **Tabelle bearbeiten** im Abschnitt **Tabelleneigenschaften** für jede partitionierte Spalte das folgende Schlüssel-Wert-Paar hinzu.
   + Fügen Sie für **Key (Schlüssel)** `read_restored_glacier_objects` hinzu.
   + Geben Sie für **Wert** `true` ein.

1. Wählen Sie **Speichern**.

### Verwenden Sie den AWS CLI
<a name="querying-glacier-using-the-aws-cli"></a>

 In der AWS CLI können Sie den Befehl AWS Glue [update-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/update-table.html) und sein `--table-input` Argument verwenden, um die Tabelle neu zu definieren und dabei die Eigenschaft hinzuzufügen. `read_restored_glacier_objects` Verwenden Sie im `--table-input`-Argument die `Parameters`-Struktur, um die `read_restored_glacier_objects`-Eigenschaft und den Wert von `true` anzugeben. Beachten Sie, dass das Argument für `--table-input` keine Leerzeichen enthalten darf und umgekehrte Schrägstriche verwenden muss, um die doppelten Anführungszeichen zu maskieren. Ersetzen Sie im folgenden Beispiel *my\$1database* und *my\$1table* durch den Namen Ihrer Datenbank und Tabelle.

```
aws glue update-table \
   --database-name my_database \
   --table-input={\"Name\":\"my_table\",\"Parameters\":{\"read_restored_glacier_objects\":\"true\"}}
```

**Wichtig**  
Der AWS Glue `update-table` Befehl funktioniert im Überschreibmodus, was bedeutet, dass er die vorhandene Tabellendefinition durch die neue Definition ersetzt, die durch den `table-input` Parameter angegeben wird. Stellen Sie daher sicher, dass Sie beim Hinzufügen der `read_restored_glacier_objects`-Eigenschaft auch alle Felder, die in Ihrer Tabelle enthalten sein sollen, im `table-input`-Parameter angeben. 

# Schema-Updates verarbeiten
<a name="handling-schema-updates-chapter"></a>

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.

**Topics**
+ [Unterstützte Schemaaktualisierungs-Operationen nach Datenformat](#summary-of-updates)
+ [Indexzugriff für Apache ORC und Apache Parquet verstehen](#index-access)
+ [Schemaaktualisierungen vornehmen](make-schema-updates.md)
+ [Tabellen mit Partitionen aktualisieren](updates-and-partitions.md)

## Unterstützte Schemaaktualisierungs-Operationen nach Datenformat
<a name="summary-of-updates"></a>

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). Daher stellt Athena eine SerDe Eigenschaft bereit, die beim Erstellen einer Tabelle definiert wird, um die Standardmethode für den Spaltenzugriff umzuschalten, was eine größere Flexibilität bei der Schemaentwicklung ermöglicht. 

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](#index-access).

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 | Zusammenfassung | 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](updates-renaming-columns.md) | 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](updates-add-columns-beginning-middle-of-table.md) | 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](updates-add-columns-end-of-table.md) | Speichern Sie Ihre Daten im CSV-, TSV-, JSON-, AVRO-, ORC- oder Parquet-Format. | Y | Y | Y | Y | Y | Y | Y | 
| [Spalten entfernen](updates-removing-columns.md) |  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](updates-reordering-columns.md) | 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](updates-changing-column-type.md) | 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
<a name="index-access"></a>

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](#orc-read-by-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](#parquet-read-by-name).

Da es sich um Standardwerte handelt, ist die Angabe dieser SerDe Eigenschaften in Ihren `CREATE TABLE` Abfragen optional, sie werden implizit verwendet. 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` Abfrage aus und ändern Sie die SerDe Einstellungen. 

**Anmerkung**  
Die SerDe Eigenschaften werden *nicht* automatisch auf jede Partition übertragen. Verwenden Sie `ALTER TABLE ADD PARTITION` Anweisungen, um die SerDe Eigenschaften für jede Partition festzulegen. 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
<a name="orc-read-by-index"></a>

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 Namen gelesen wird, was es Ihnen ermöglicht, Spalten in der Mitte der Tabelle hinzuzufügen oder Spalten in ORC zu entfernen, setzen Sie die SerDe Eigenschaft `false` in der `orc.column.index.access` `CREATE TABLE` Anweisung auf. 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
<a name="parquet-read-by-name"></a>

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 nach Index lesen zu lassen, sodass Sie Spalten umbenennen können, müssen Sie eine Tabelle mit der `parquet.column.index.access` SerDe Eigenschaft auf erstellen. `true`

# Schemaaktualisierungen vornehmen
<a name="make-schema-updates"></a>

In diesem Thema werden einige der Änderungen beschrieben, die Sie in `CREATE TABLE`-Anweisungen am Schema vornehmen können, ohne Ihre Daten tatsächlich zu ändern. Um ein Schema zu aktualisieren, können Sie in einigen Fällen einen `ALTER TABLE`-Befehl verwenden, in anderen Fällen ändern Sie jedoch nicht wirklich eine vorhandene Tabelle. Stattdessen erstellen Sie eine Tabelle mit einem neuen Namen, der das Schema ändert, das Sie in Ihrer ursprünglichen `CREATE TABLE`-Anweisung verwendet haben.

Je nachdem, wie sich Ihre Schemata voraussichtlich weiterentwickeln, verwenden Sie ein kompatibles Datenformat, um weiterhin Athena-Abfragen verwenden zu können. 

Untersuchen wir als Erstes eine Anwendung, in der Bestellinformationen aus einer `orders`-Tabelle gelesen werden, die in zwei Formaten existiert: CSV und Parquet. 

Mit dem folgenden Beispiel wird eine Tabelle in Parquet erstellt:

```
CREATE EXTERNAL TABLE orders_parquet (
   `orderkey` int, 
   `orderstatus` string, 
   `totalprice` double, 
   `orderdate` string, 
   `orderpriority` string, 
   `clerk` string, 
   `shippriority` int
) STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_ parquet/';
```

Mit dem folgenden Beispiel wird die gleiche Tabelle in CSV erstellt:

```
CREATE EXTERNAL TABLE orders_csv (
   `orderkey` int, 
   `orderstatus` string, 
   `totalprice` double, 
   `orderdate` string, 
   `orderpriority` string, 
   `clerk` string, 
   `shippriority` int
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/orders_csv/';
```

Folgende Themen zeigen wie sich Aktualisierungen für diese Tabellen auf Athena-Abfragen auswirken.

**Topics**
+ [Hinzufügen von Spalten am Anfang oder in der Mitte der Tabelle](updates-add-columns-beginning-middle-of-table.md)
+ [Hinzufügen von Spalten am Ende der Tabelle](updates-add-columns-end-of-table.md)
+ [Spalten entfernen](updates-removing-columns.md)
+ [Spalten umbenennen](updates-renaming-columns.md)
+ [Neuanordnen von Spalten](updates-reordering-columns.md)
+ [Datentyp einer Spalte ändern](updates-changing-column-type.md)

# Hinzufügen von Spalten am Anfang oder in der Mitte der Tabelle
<a name="updates-add-columns-beginning-middle-of-table"></a>

Das Hinzufügen von Spalten ist eine der am häufigsten vorkommenden Schemaänderungen. Beispielsweise können Sie eine neue Spalte hinzufügen, um die Tabelle um neue Daten zu erweitern. Alternativ können Sie eine neue Spalte hinzufügen, wenn sich die Quelle für eine vorhandene Spalte geändert hat, und die vorherige Version dieser Spalte beibehalten. So haben Sie Zeit, Anwendungen anzupassen, die von dieser Spalte abhängig sind.

Um Spalten am Anfang oder in der Mitte der Tabelle hinzuzufügen und weiterhin Abfragen für bestehende Tabellen auszuführen, verwenden Sie AVRO, JSON sowie Parquet und ORC, wenn deren SerDe Eigenschaft auf Lesen nach Namen gesetzt ist. Weitere Informationen finden Sie unter [Indexzugriff für Apache ORC und Apache Parquet verstehen](handling-schema-updates-chapter.md#index-access).

Fügen Sie keine Spalten am Anfang oder in der Mitte der Tabelle in CSV und TSV hinzu, da diese Formate von der Reihenfolge abhängen. Das Hinzufügen einer Spalte führt in diesen Fällen zu Schemakonflikten, falls sich das Schema der Partitionen ändert.

 Im folgenden Beispiel wird eine neue Tabelle erstellt, die eine `o_comment`-Spalte in der Mitte einer auf JSON-Daten basierenden Tabelle hinzufügt.

```
CREATE EXTERNAL TABLE orders_json_column_addition (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_comment` string, 
   `o_totalprice` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/orders_json/';
```

# Hinzufügen von Spalten am Ende der Tabelle
<a name="updates-add-columns-end-of-table"></a>

Wenn Sie Tabellen in einem der von Athena unterstützten Formate wie Parquet, ORC, Avro, JSON, CSV und TSV erstellen, können Sie mit der `ALTER TABLE ADD COLUMNS`-Anweisung Spalten nach vorhandenen Spalten, aber vor Partitionsspalten hinzufügen.

Im folgenden Beispiel wird eine `comment`-Spalte am Ende der `orders_parquet`-Tabelle vor allen Partitionsspalten hinzugefügt: 

```
ALTER TABLE orders_parquet ADD COLUMNS (comment string)
```

**Anmerkung**  
Um im Athena-Abfrage-Editor nach der Ausführung von `ALTER TABLE ADD COLUMNS` eine neue Tabellenspalte anzuzeigen, aktualisieren Sie die Tabellenliste im Editor manuell und erweitern die Tabelle anschließend erneut.

# Spalten entfernen
<a name="updates-removing-columns"></a>

Möglicherweise müssen Sie Spalten aus Tabellen entfernen, wenn sie keine Daten mehr enthalten, oder zum Einschränken des Zugriffs auf die darin enthaltenen Daten.
+ Sie können Spalten aus Tabellen in JSON, Avro und Parquet und ORC entfernen, wenn diese dem Namen nach lesen. Weitere Informationen finden Sie unter [Indexzugriff für Apache ORC und Apache Parquet verstehen](handling-schema-updates-chapter.md#index-access). 
+ Wir raten davon ab, Spalten aus Tabellen in CSV und TSV zu entfernen, wenn Sie die Tabellen, die Sie bereits in Athena angelegt haben, beibehalten möchten. Das Entfernen einer Spalte stört das Schema und erfordert, dass Sie die Tabelle ohne die entfernte Spalte neu anlegen.

In diesem Beispiel entfernen Sie eine Spalte ``totalprice`` aus einer Tabelle in Parquet und führen eine Abfrage aus. In Athena wird Parquet standardmäßig dem Namen nach gelesen. Deshalb lassen wir die Konfiguration SERDEPROPERTIES weg, die das Lesen dem Namen nach angibt. Beachten Sie, dass die folgende Abfrage erfolgreich ist, obwohl Sie das Schema geändert haben:

```
CREATE EXTERNAL TABLE orders_parquet_column_removed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

# Spalten umbenennen
<a name="updates-renaming-columns"></a>

Möglicherweise möchten Sie in Ihren Tabellen Spalten umbenennen, um die Schreibweise zu korrigieren, Spalten mit besser verständlichen Namen zu versehen oder eine vorhandene Spalte erneut nutzen, um eine Änderung der Reihenfolge für die Spalten zu vermeiden.

Sie können Spalten umbenennen, wenn Sie Ihre Daten in CSV und TSV speichern, oder in Parquet und ORC, wenn diese so konfiguriert sind, dass sie dem Index nach lesen. Weitere Informationen finden Sie unter [Indexzugriff für Apache ORC und Apache Parquet verstehen](handling-schema-updates-chapter.md#index-access). 

Athena liest Daten in CSV und TSV in der Reihenfolge der Spalten in das Schema und gibt sie in der gleichen Reihenfolge aus. Hierbei werden keine Spaltennamen für das Mapping von Daten in einer Spalte verwendet. Aus diesem Grund können Sie keine Spalten in CSV oder TSV umbenennen, ohne Athena-Abfragen zu beschädigen. 

Eine Strategie zum Umbenennen von Spalten besteht darin, eine neue Tabelle zu erstellen, die auf denselben zugrunde liegenden Daten basiert, jedoch unter Verwendung neuer Spaltennamen. Im folgenden Beispiel wird eine neue `orders_parquet`-Tabelle `orders_parquet_column_renamed`erstellt. Im Beispiel wird der Spaltenname ``o_totalprice`` zu ``o_total_price`` und führt dann eine Abfrage in Athena aus: 

```
CREATE EXTERNAL TABLE orders_parquet_column_renamed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_total_price` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

Im Fall der Parquet-Tabelle wird die folgende Abfrage erfolgreich ausgeführt, aber die umbenannte Spalte zeigt keine Daten an, da auf die Spalte nicht über den Index, sondern über den Namen zugegriffen wurde (ein Standard in Parquet):

```
SELECT * 
FROM orders_parquet_column_renamed;
```

Eine Abfrage mit einer Tabelle in CSV sieht ähnlich aus:

```
CREATE EXTERNAL TABLE orders_csv_column_renamed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_total_price` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/orders_csv/';
```

Bei der CSV-Tabelle wird die folgende Abfrage ausgeführt und für alle Spalten erscheinen Daten, auch für die umbenannte Spalte:

```
SELECT * 
FROM orders_csv_column_renamed;
```

# Neuanordnen von Spalten
<a name="updates-reordering-columns"></a>

Sie können Spalten nur für Tabellen mit Daten in Formaten neu anordnen, die dem Namen nach lesen, wie JSON oder Parquet, die standardmäßig dem Namen nach lesen. Sie können ORC bei Bedarf auch nach Namen lesen lassen. Weitere Informationen finden Sie unter [Indexzugriff für Apache ORC und Apache Parquet verstehen](handling-schema-updates-chapter.md#index-access).

Das folgende Beispiel erstellt eine neue Tabelle mit den Spalten in einer anderen Reihenfolge:

```
CREATE EXTERNAL TABLE orders_parquet_columns_reordered (
   `o_comment` string,
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderpriority` string, 
   `o_orderstatus` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_orderdate` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

# Datentyp einer Spalte ändern
<a name="updates-changing-column-type"></a>

Möglicherweise möchten Sie einen anderen Spaltentyp verwenden, wenn der vorhandene Typ nicht mehr die erforderliche Menge an Informationen aufnehmen kann. Beispielsweise könnten die Werte einer ID-Spalte die Größe des `INT`-Datentyps überschreiten und die Verwendung des `BIGINT`-Datentyps erfordern.

## Überlegungen
<a name="updates-changing-column-type-considerations"></a>

Berücksichtigen Sie bei der Verwendung eines anderen Datentyps für eine Spalte die folgenden Punkte: 
+ In den meisten Fällen können Sie den Datentyp einer Spalte nicht direkt ändern. Stattdessen erstellen Sie die Athena-Tabelle neu und definieren die Spalte mit dem neuen Datentyp. 
+ Nur bestimmte Datentypen können als andere Datentypen gelesen werden. In der Tabelle in diesem Abschnitt finden Sie die Datentypen, die so behandelt werden können.
+ Für Daten in Parquet und ORC können Sie keinen anderen Datentyp für eine Spalte verwenden, wenn die Tabelle nicht partitioniert ist. 
+ In partitionierten Tabellen in Parquet und ORC kann sich der Spaltentyp einer Partition vom Spaltentyp einer anderen Partition unterscheiden und Athena wendet `CAST` auf den gewünschten Typ an, wenn dies möglich ist. Weitere Informationen finden Sie unter [Vermeiden von Schemakonflikt-Fehlern für Tabellen mit Partitionen](updates-and-partitions.md#partitions-dealing-with-schema-mismatch-errors).
+ Bei Tabellen, die [LazySimpleSerDe](lazy-simple-serde.md)nur mit der Anweisung erstellt wurden, ist es möglich, die `ALTER TABLE REPLACE COLUMNS` Anweisung zu verwenden, um vorhandene Spalten durch einen anderen Datentyp zu ersetzen. Alle vorhandenen Spalten, die Sie behalten möchten, müssen jedoch ebenfalls in der Anweisung neu definiert werden, andernfalls werden sie gelöscht. Weitere Informationen finden Sie unter [ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md).
+ Nur für Apache-Iceberg-Tabellen können Sie die [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md)-Anweisung verwenden, um den Datentyp einer Spalte zu ändern. `ALTER TABLE REPLACE COLUMNS` wird für Iceberg-Tabellen nicht unterstützt. Weitere Informationen finden Sie unter [Iceberg-Tabellenschema weiterentwickeln](querying-iceberg-evolving-table-schema.md).

**Wichtig**  
Wir raten Ihnen dringend, Ihre Abfragen zu testen und zu überprüfen, bevor Sie Datentyp-Änderungen vornehmen. Wenn Athena den Zieldatentyp nicht verwenden kann, schlägt die `CREATE TABLE`-Abfrage möglicherweise fehl. 

## Kompatible Datentypen verwenden
<a name="updates-changing-column-type-use-compatible-data-types"></a>

Verwenden Sie nach Möglichkeit kompatible Datentypen. In der folgenden Tabelle sind Datentypen aufgeführt, die wie andere Datentypen behandelt werden können:


| Original-Datentyp | Verfügbare Ziel-Datentypen | 
| --- | --- | 
| STRING | BYTE, TINYINT, SMALLINT, INT, BIGINT | 
| BYTE | TINYINT, SMALLINT, INT, BIGINT | 
| TINYINT | SMALLINT, INT, BIGINT | 
| SMALLINT | INT, BIGINT | 
| INT | BIGINT | 
| FLOAT | DOUBLE | 

Im folgenden Beispiel wird die `CREATE TABLE`-Anweisung für die `orders_json`-Originaltabelle verwendet, um eine neue Tabelle mit dem Namen `orders_json_bigint` zu erstellen. Die neue Tabelle verwendet `BIGINT` statt `INT` als Datentyp für die ``o_shippriority``-Spalte. 

```
CREATE EXTERNAL TABLE orders_json_bigint (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_totalprice` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` BIGINT
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/orders_json';
```

Die folgende Abfrage wird erfolgreich ausgeführt, ähnlich wie die `SELECT`-Originalabfrage vor dem Ändern des Datentyps:

```
Select * from orders_json 
LIMIT 10;
```

# Tabellen mit Partitionen aktualisieren
<a name="updates-and-partitions"></a>

In Athena müssen eine Tabelle und ihre Partitionen die gleichen Datenformate verwenden, ihre Schemata können aber unterschiedlich sein. Wenn Sie eine neue Partition erstellen, erbt die Partition in der Regel das Schema der Tabelle. Im Laufe der Zeit können sich die Schemas ggf. unterscheiden. Gründe sind u. a.:
+ Wenn sich das Schema der Tabelle ändert, werden die Schemas für Partitionen nicht aktualisiert, um weiterhin dem Schema der Tabelle zu entsprechen. 
+ Der AWS Glue Crawler ermöglicht es Ihnen, Daten in Partitionen mit unterschiedlichen Schemas zu entdecken. Das heißt, wenn Sie eine Tabelle in Athena mit erstellen AWS Glue, nachdem der Crawler die Verarbeitung abgeschlossen hat, können die Schemas für die Tabelle und ihre Partitionen unterschiedlich sein.
+ Wenn Sie Partitionen direkt über eine API hinzufügen. AWS 

Athena verarbeitet Tabellen mit Partitionen erfolgreich, wenn sie die folgenden Beschränkungen erfüllen. Wenn diese Beschränkungen nicht erfüllt sind, gibt Athena einen HIVE\$1PARTITION\$1SCHEMA\$1MISMATCH-Fehler aus. 
+ Das Schema jeder Partition ist kompatibel mit dem Tabellenschema. 
+ Das Datenformat der Tabelle ermöglicht die Art der Aktualisierung, die Sie ausführen möchten: Spalten hinzufügen, löschen, ihre Reihenfolge ändern oder den Datentyp einer Spalte ändern. 

  Beispiel: In den Formaten CSV und TSV können Sie Spalten umbenennen, neue Spalten am Ende der Tabelle hinzufügen und den Datentyp einer Spalte ändern, falls die Typen kompatibel sind. Sie können aber keine Spalten entfernen. Bei anderen Formaten können Sie Spalten hinzufügen oder entfernen oder den Datentyp in einen anderen ändern, wenn die Typen kompatibel sind. Weitere Informationen finden Sie unter [Zusammenfassung: Updates und Datenformate in Athena](handling-schema-updates-chapter.md#summary-of-updates). 

## Vermeiden von Schemakonflikt-Fehlern für Tabellen mit Partitionen
<a name="partitions-dealing-with-schema-mismatch-errors"></a>

Zu Beginn der Abfrageausführung überprüft Athena das Schema einer Tabelle, indem überprüft wird, dass der Datentyp jeder Spalte in der Tabelle und der Partition kompatibel ist. 
+ Für Parquet- und ORC-Datenspeichertypen stützt sich Athena auf die Spaltennamen und verwendet sie für die auf Spaltennamen basierte Überprüfung des Schemas. Dadurch werden `HIVE_PARTITION_SCHEMA_MISMATCH`-Fehler für Tabellen mit Partitionen in Parquet und ORC verhindert. (Dies gilt für ORC, wenn die SerDe Eigenschaft so eingestellt ist, dass sie namentlich auf den Index zugreift:`orc.column.index.access=FALSE`. Parquet liest den Index standardmäßig nach Namen).
+ Für CSV, JSON und Avro verwendet Athena eine Index-basierte Schemaverifizierung. Das bedeutet: Wenn bei Ihnen ein Schemakonflikt-Fehler auftritt, sollten Sie die Partition löschen, die einen Schemakonflikt auslöst, und sie erneut erstellen. So kann Athena sie ohne Fehler abfragen.

 Athena vergleicht das Schema der Tabelle mit den Partitionsschemata. Wenn Sie mit AWS Glue Crawler eine Tabelle in CSV, JSON und AVRO in Athena erstellen, können die Schemas für die Tabelle und ihre Partitionen nach Abschluss der Verarbeitung durch den Crawler unterschiedlich sein. Tritt ein Konflikt zwischen dem Tabellen- und dem Partitionsschema auf, scheitern Ihre Abfragen in Athena wegen eines Fehlers beim Überprüfen des Schemas, ähnlich dem Folgenden: „‚crawler\$1test.click\$1avro‘ ist als Typ ‚string‘ deklariert, in der Partition ‚partition\$10=2017-01-17‘ ist die Spalte ‚col68‘ aber mit dem Typ ‚double‘ deklariert.“

Eine typische Behelfslösung für diesen Fehler besteht darin, dass die Partition entfernt wird, die den Fehler auslöst, und Sie sie dann erneut erstellen. Weitere Informationen erhalten Sie unter [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) und [ALTER TABLE ADD PARTITION](alter-table-add-partition.md).

# Arrays abfragen
<a name="querying-arrays"></a>

Sie können mit Amazon Athena Arrays erstellen, sie verketten, in andere Datentypen umwandeln und anschließend filtern, reduzieren und sortieren.

**Topics**
+ [Arrays erstellen](creating-arrays.md)
+ [Zeichenfolgen und Arrays verketten](concatenating-strings-and-arrays.md)
+ [Array-Datentypen konvertieren](converting-array-data-types.md)
+ [Array-Längen ermitteln](finding-lengths.md)
+ [Auf Array-Elemente zugreifen](accessing-array-elements.md)
+ [Verschachtelte Arrays abflachen](flattening-arrays.md)
+ [Erstellen von Arrays aus Unterabfragen](creating-arrays-from-subqueries.md)
+ [Filtern von Arrays](filtering-arrays.md)
+ [Arrays sortieren](sorting-arrays.md)
+ [Aggregations-Funktionen mit Arrays verwenden](arrays-and-aggregation.md)
+ [Arrays in Zeichenfolgen konvertieren](converting-arrays-to-strings.md)
+ [Arrays zum Erstellen von Karten verwenden](arrays-create-maps.md)
+ [Abfragen von Arrays mit komplexen Typen](rows-and-structs.md)

# Arrays erstellen
<a name="creating-arrays"></a>

Zum Erstellen eines Arrayliterals in Athena verwenden Sie das Schlüsselwort `ARRAY`, gefolgt von Klammern `[ ]`, und schließen die durch Kommata getrennten Array-Elemente ein.

## Beispiele
<a name="examples"></a>

Diese Abfrage erstellt ein Array mit vier Elementen.

```
SELECT ARRAY [1,2,3,4] AS items
```

Folgendes wird zurückgegeben:

```
+-----------+
| items     |
+-----------+
| [1,2,3,4] |
+-----------+
```

Diese Abfrage erstellt zwei Arrays.

```
SELECT ARRAY[ ARRAY[1,2], ARRAY[3,4] ] AS items
```

Folgendes wird zurückgegeben:

```
+--------------------+
| items              |
+--------------------+
| [[1, 2], [3, 4]]   |
+--------------------+
```

Zum Erstellen eines Arrays aus ausgewählten Spalten kompatibler Typen nutzen Sie eine Abfrage, wie im folgenden Beispiel gezeigt:

```
WITH
dataset AS (
  SELECT 1 AS x, 2 AS y, 3 AS z
)
SELECT ARRAY [x,y,z] AS items FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+-----------+
| items     |
+-----------+
| [1,2,3]   |
+-----------+
```

Im folgenden Beispiel werden zwei Arrays ausgewählt und in Form einer Willkommensnachricht zurückgegeben.

```
WITH
dataset AS (
  SELECT
    ARRAY ['hello', 'amazon', 'athena'] AS words,
    ARRAY ['hi', 'alexa'] AS alexa
)
SELECT ARRAY[words, alexa] AS welcome_msg
FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+----------------------------------------+
| welcome_msg                            |
+----------------------------------------+
| [[hello, amazon, athena], [hi, alexa]] |
+----------------------------------------+
```

Zum Erstellen eines Arrays aus Schlüssel/Wert-Paaren nutzen Sie den `MAP`-Operator. Dieser verwendet ein Schlüssel-Array gefolgt von einem Werte-Array, wie im folgenden Beispiel gezeigt:

```
SELECT ARRAY[
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Bob', 'Smith', '40']),
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Jane', 'Doe', '30']),
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Billy', 'Smith', '8'])
] AS people
```

Diese Abfrage gibt Folgendes zurück:

```
+-----------------------------------------------------------------------------------------------------+
| people                                                                                              |
+-----------------------------------------------------------------------------------------------------+
| [{last=Smith, first=Bob, age=40}, {last=Doe, first=Jane, age=30}, {last=Smith, first=Billy, age=8}] |
+-----------------------------------------------------------------------------------------------------+
```

# Zeichenfolgen und Arrays verketten
<a name="concatenating-strings-and-arrays"></a>

Beim Verketten von Zeichenfolgen und beim Verketten von Arrays werden ähnliche Techniken verwendet.

## Zeichenfolgen verketten
<a name="concatenating-strings"></a>

Um zwei Zeichenfolgen zu verketten, können Sie doppelte Pipe-`||`-Operator verwenden, wie im folgenden Beispiel gezeigt.

```
SELECT 'This' || ' is' || ' a' || ' test.' AS Concatenated_String
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

Sie können die `concat()`-Funktion verwenden, um dasselbe Ergebnis zu erzielen.

```
SELECT concat('This', ' is', ' a', ' test.') AS Concatenated_String
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

Sie können die `concat_ws()`-Funktion verwenden, um Zeichenketten mit dem im ersten Argument angegebenen Trennzeichen zu verketten.

```
SELECT concat_ws(' ', 'This', 'is', 'a', 'test.') as Concatenated_String
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

Um zwei Spalten des Datentyps „Zeichenfolge“ mit einem Punkt zu verketten, verweisen Sie mit doppelten Anführungszeichen auf die beiden Spalten und schließen Sie den Punkt als hartcodierte Zeichenfolge in einfache Anführungszeichen ein. Wenn eine Spalte nicht vom Datentyp „Zeichenfolge“ ist, können Sie `CAST("column_name" as VARCHAR)` verwenden, um die Spalte zuerst umzuwandeln.

```
SELECT "col1" || '.' || "col2" as Concatenated_String
FROM my_table
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `col1_string_value.col2_string_value`  | 

## Arrays verketten
<a name="concatenating-arrays"></a>

Sie können die gleichen Techniken verwenden, um Arrays zu verketten.

Verwenden Sie zum Verketten von mehreren Arrays den doppelten Pipe-Operator `||`.

```
SELECT ARRAY [4,5] || ARRAY[ ARRAY[1,2], ARRAY[3,4] ] AS items
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | Elemente | 
| --- | --- | 
| 1 |  `[[4, 5], [1, 2], [3, 4]]`  | 

Um mehrere Arrays zu einem einzigen Array zu kombinieren, verwenden Sie den Doppelpipe-Operator oder die `concat()`-Funktion.

```
WITH
dataset AS (
  SELECT
    ARRAY ['Hello', 'Amazon', 'Athena'] AS words,
    ARRAY ['Hi', 'Alexa'] AS alexa
)
SELECT concat(words, alexa) AS welcome_msg
FROM dataset
```

Diese Abfrage gibt Folgendes zurück:


****  

| \$1 | welcome\$1msg | 
| --- | --- | 
| 1 |  `[Hello, Amazon, Athena, Hi, Alexa]`  | 

Weitere Informationen zum `concat()` anderer Zeichenfolgenfunktionen finden Sie unter [Zeichenfolgenfunktionen und -operatoren](https://trino.io/docs/current/functions/string.html) in der Trino-Dokumentation.

# Array-Datentypen konvertieren
<a name="converting-array-data-types"></a>

Um Daten in einem Array in einen unterstützten Datentyp zu konvertieren, verwenden Sie den `CAST`-Operator als `CAST(value AS type)`. Athena unterstützt alle nativen Presto-Datentypen.

```
SELECT
   ARRAY [CAST(4 AS VARCHAR), CAST(5 AS VARCHAR)]
AS items
```

Diese Abfrage gibt Folgendes zurück:

```
+-------+
| items |
+-------+
| [4,5] |
+-------+
```

Erstellen Sie zwei Arrays mit Schlüssel-Wert-Paar-Elementen, konvertieren Sie sie zu JSON und verketten Sie sie wie in diesem Beispiel:

```
SELECT
   ARRAY[CAST(MAP(ARRAY['a1', 'a2', 'a3'], ARRAY[1, 2, 3]) AS JSON)] ||
   ARRAY[CAST(MAP(ARRAY['b1', 'b2', 'b3'], ARRAY[4, 5, 6]) AS JSON)]
AS items
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------------------------------------------+
| items                                            |
+--------------------------------------------------+
| [{"a1":1,"a2":2,"a3":3}, {"b1":4,"b2":5,"b3":6}] |
+--------------------------------------------------+
```

# Array-Längen ermitteln
<a name="finding-lengths"></a>

Die Funktion `cardinality` gibt die Länge eines Arrays wie in diesem Beispiel zurück:

```
SELECT cardinality(ARRAY[1,2,3,4]) AS item_count
```

Diese Abfrage gibt Folgendes zurück:

```
+------------+
| item_count |
+------------+
| 4          |
+------------+
```

# Auf Array-Elemente zugreifen
<a name="accessing-array-elements"></a>

Verwenden Sie für den Zugriff auf Array-Elemente den `[]`-Operator, wobei 1 das erste Elemente bezeichnet, 2 das zweite Elemente usw., wie im folgenden Beispiel:

```
WITH dataset AS (
SELECT
   ARRAY[CAST(MAP(ARRAY['a1', 'a2', 'a3'], ARRAY[1, 2, 3]) AS JSON)] ||
   ARRAY[CAST(MAP(ARRAY['b1', 'b2', 'b3'], ARRAY[4, 5, 6]) AS JSON)]
AS items )
SELECT items[1] AS item FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+------------------------+
| item                   |
+------------------------+
| {"a1":1,"a2":2,"a3":3} |
+------------------------+
```

Verwenden Sie für den Zugriff auf die Array-Elemente an einer bestimmten Position (die Indexposition) die Funktion `element_at()` und geben Sie den Namen des Array und die Indexposition an:
+ Wenn der Index größer als 0 ist, gibt `element_at()` das angegebene Element zurück und zählt das Array dabei von Anfang bis Ende durch. Die Funktion verhält sich dabei wie der `[]`-Operator.
+ Wenn der Index kleiner als 0 ist, gibt `element_at()` das angegebene Element zurück und zählt das Array dabei von Ende bis Anfang durch.

In der folgenden Abfrage wird ein Array `words` erstellt und das erste Element `hello` als `first_word`, das zweite Element `amazon` (vom Ende des Arrays aus gezählt) als `middle_word` und das dritte Element `athena` als `last_word` ausgewählt.

```
WITH dataset AS (
  SELECT ARRAY ['hello', 'amazon', 'athena'] AS words
)
SELECT
  element_at(words, 1) AS first_word,
  element_at(words, -2) AS middle_word,
  element_at(words, cardinality(words)) AS last_word
FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+----------------------------------------+
| first_word  | middle_word | last_word  |
+----------------------------------------+
| hello       | amazon      | athena     |
+----------------------------------------+
```

# Verschachtelte Arrays abflachen
<a name="flattening-arrays"></a>

Beim Arbeiten mit verschachtelten Arrays müssen Sie verschachtelte Array-Elemente oft zu einem einzelnen Array erweitern oder das Array in mehrere Zeilen erweitern.

## Abflachfunktion verwenden
<a name="flattening-arrays-flatten-function"></a>

Verwenden Sie die Funktion `flatten`, um die Elemente eines verschachtelten Arrays zu einem einzelnen Array mit Werten zu reduzieren. Diese Abfrage gibt eine Zeile für jedes Element im Array zurück.

```
SELECT flatten(ARRAY[ ARRAY[1,2], ARRAY[3,4] ]) AS items
```

Diese Abfrage gibt Folgendes zurück:

```
+-----------+
| items     |
+-----------+
| [1,2,3,4] |
+-----------+
```

## CROSS JOIN und UNNEST verwenden
<a name="flattening-arrays-cross-join-and-unnest"></a>

Um ein Array in mehrere Zeilen zu reduzieren, verwenden Sie `CROSS JOIN` in Verbindung mit dem `UNNEST`-Operator wie in diesem Beispiel:

```
WITH dataset AS (
  SELECT
    'engineering' as department,
    ARRAY['Sharon', 'John', 'Bob', 'Sally'] as users
)
SELECT department, names FROM dataset
CROSS JOIN UNNEST(users) as t(names)
```

Diese Abfrage gibt Folgendes zurück:

```
+----------------------+
| department  | names  |
+----------------------+
| engineering | Sharon |
+----------------------|
| engineering | John   |
+----------------------|
| engineering | Bob    |
+----------------------|
| engineering | Sally  |
+----------------------+
```

Um ein Array mit Schlüssel-Wert-Paaren zu reduzieren, verteilen Sie die ausgewählten Schlüssel wie in diesem Beispiel in Spalten:

```
WITH
dataset AS (
  SELECT
    'engineering' as department,
     ARRAY[
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Bob', 'Smith', '40']),
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Jane', 'Doe', '30']),
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Billy', 'Smith', '8'])
     ] AS people
  )
SELECT names['first'] AS
 first_name,
 names['last'] AS last_name,
 department FROM dataset
CROSS JOIN UNNEST(people) AS t(names)
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------------------------------+
| first_name | last_name | department  |
+--------------------------------------+
| Bob        | Smith     | engineering |
| Jane       | Doe       | engineering |
| Billy      | Smith     | engineering |
+--------------------------------------+
```

Wählen Sie aus einer Liste mit Mitarbeitern den Mitarbeiter mit den höchsten kombinierten Werten aus. `UNNEST` kann in der Klausel `FROM` ohne vorangestelltes `CROSS JOIN`, da es der Standard-JOIN-Operator ist und somit vorausgesetzt wird.

```
WITH
dataset AS (
  SELECT ARRAY[
    CAST(ROW('Sally', 'engineering', ARRAY[1,2,3,4]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
    CAST(ROW('John', 'finance', ARRAY[7,8,9]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
    CAST(ROW('Amy', 'devops', ARRAY[12,13,14,15]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER)))
  ] AS users
),
users AS (
 SELECT person, score
 FROM
   dataset,
   UNNEST(dataset.users) AS t(person),
   UNNEST(person.scores) AS t(score)
)
SELECT person.name, person.department, SUM(score) AS total_score FROM users
GROUP BY (person.name, person.department)
ORDER BY (total_score) DESC
LIMIT 1
```

Diese Abfrage gibt Folgendes zurück:

```
+---------------------------------+
| name | department | total_score |
+---------------------------------+
| Amy  | devops     | 54          |
+---------------------------------+
```

Wählen Sie aus einer Liste mit Mitarbeitern den Mitarbeiter mit den höchsten einzelnen Werten aus.

```
WITH
dataset AS (
 SELECT ARRAY[
   CAST(ROW('Sally', 'engineering', ARRAY[1,2,3,4]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
   CAST(ROW('John', 'finance', ARRAY[7,8,9]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
   CAST(ROW('Amy', 'devops', ARRAY[12,13,14,15]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER)))
 ] AS users
),
users AS (
 SELECT person, score
 FROM
   dataset,
   UNNEST(dataset.users) AS t(person),
   UNNEST(person.scores) AS t(score)
)
SELECT person.name, score FROM users
ORDER BY (score) DESC
LIMIT 1
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------+
| name | score |
+--------------+
| Amy  | 15    |
+--------------+
```

### Überlegungen zu CROSS JOIN und UNNEST
<a name="flattening-arrays-cross-join-and-unnest-considerations"></a>

Wenn `UNNEST` für ein oder mehrere Arrays in der Abfrage verwendet wird und eines der Arrays `NULL` ist, gibt die Abfrage keine Zeilen zurück. Wenn `UNNEST` in ein Array verwendet wird, das eine leere Zeichenfolge ist, wird die leere Zeichenfolge zurückgegeben.

In der folgenden Abfrage werden beispielsweise keine Zeilen zurückgegeben, da das zweite Array null ist.

```
SELECT 
    col1, 
    col2 
FROM UNNEST (ARRAY ['apples','oranges','lemons']) AS t(col1)
CROSS JOIN UNNEST (ARRAY []) AS t(col2)
```

Im nächsten Beispiel wird das zweite Array so geändert, dass es eine leere Zeichenfolge enthält. Für jede Zeile gibt die Abfrage den Wert in `col1` und eine leere Zeichenfolge für den Wert in `col2` zurück. Die leere Zeichenfolge im zweiten Array ist erforderlich, damit die Werte im ersten Array zurückgegeben werden.

```
SELECT 
    col1, 
    col2 
FROM UNNEST (ARRAY ['apples','oranges','lemons']) AS t(col1)
CROSS JOIN UNNEST (ARRAY ['']) AS t(col2)
```

# Erstellen von Arrays aus Unterabfragen
<a name="creating-arrays-from-subqueries"></a>

Erstellen Sie ein Array aus einer Sammlung von Zeilen.

```
WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
SELECT array_agg(i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

Diese Abfrage gibt Folgendes zurück:

```
+-----------------+
| array_items     |
+-----------------+
| [1, 2, 3, 4, 5] |
+-----------------+
```

Nutzen Sie das Schlüsselwort `distinct`, um ein Array, bestehend aus eindeutigen Werten, aus einer Reihe von Zeilen zu erstellen.

```
WITH
dataset AS (
  SELECT ARRAY [1,2,2,3,3,4,5] AS items
)
SELECT array_agg(distinct i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

Diese Abfrage gibt das folgende Ergebnis zurück. Beachten Sie, dass die Reihenfolge nicht garantiert ist.

```
+-----------------+
| array_items     |
+-----------------+
| [1, 2, 3, 4, 5] |
+-----------------+
```

Weitere Informationen zur Verwendung der `array_agg`-Funktion siehe [Aggregate functions](https://trino.io/docs/current/functions/aggregate.html) (Aggregationsfunktionen) in der Trino-Dokumentation.

# Filtern von Arrays
<a name="filtering-arrays"></a>

Erstellen Sie ein Array aus einer Reihe von Zeilen, die den Filterkriterien entsprechen.

```
WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
SELECT array_agg(i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE i > 3
```

Diese Abfrage gibt Folgendes zurück:

```
+-------------+
| array_items |
+-------------+
| [4, 5]      |
+-------------+
```

Filtern Sie ein Array basierend darauf, ob Elemente einen bestimmten Wert (z. B. 2) enthalten, wie in diesem Beispiel:

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
)
SELECT i AS array_items FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE contains(i, 2)
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------+
| array_items  |
+--------------+
| [1, 2, 3, 4] |
+--------------+
```

## Funktion `filter` verwenden
<a name="filtering-arrays-filter-function"></a>

```
 filter(ARRAY [list_of_values], boolean_function)
```

Sie können die `filter` Funktion für einen `ARRAY` Ausdruck verwenden, um ein neues Array zu erstellen, das die Teilmenge der Elemente darstellt, *list\$1of\$1values* für die wahr *boolean\$1function* ist. Die `filter` Funktion kann in Fällen nützlich sein, in denen Sie die *UNNEST* Funktion nicht verwenden können.

Im folgenden Beispiel wird im Array `[1,0,5,-1]` nach Werten größer als Null gefiltert.

```
SELECT filter(ARRAY [1,0,5,-1], x -> x>0)
```

**Ergebnisse**  
`[1,5]`

Im folgenden Beispiel wird im Array `[-1, NULL, 10, NULL]` nach Werten ungleich Null gefiltert.

```
SELECT filter(ARRAY [-1, NULL, 10, NULL], q -> q IS NOT NULL)
```

**Ergebnisse**  
`[-1,10]`

# Arrays sortieren
<a name="sorting-arrays"></a>

Um ein sortiertes Array eindeutiger Werte aus einer Reihe von Zeilen zu erstellen, können Sie wie im folgenden Beispiel die Funktion [array\$1sort](https://prestodb.io/docs/current/functions/array.html#array_sort) verwenden.

```
WITH
dataset AS (
  SELECT ARRAY[3,1,2,5,2,3,6,3,4,5] AS items
)
SELECT array_sort(array_agg(distinct i)) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------------+
| array_items        |
+--------------------+
| [1, 2, 3, 4, 5, 6] |
+--------------------+
```

Informationen zum Erweitern eines Arrays in mehrere Zeilen finden Sie unter [Verschachtelte Arrays abflachen](flattening-arrays.md).

# Aggregations-Funktionen mit Arrays verwenden
<a name="arrays-and-aggregation"></a>
+ Fügen Sie mit `SUM` Werte zu einem Array hinzu, wie im folgenden Beispiel dargestellt.
+ Aggregieren Sie mit `array_agg` mehrere Zeilen in einem Array. Weitere Informationen finden Sie unter [Erstellen von Arrays aus Unterabfragen](creating-arrays-from-subqueries.md).

**Anmerkung**  
`ORDER BY` wird für Aggregationsfunktionen unterstützt, die in Athena Engine Version 2 beginnen.

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
),
item AS (
  SELECT i AS array_items
  FROM dataset, UNNEST(items) AS t(i)
)
SELECT array_items, sum(val) AS total
FROM item, UNNEST(array_items) AS t(val)
GROUP BY array_items;
```

In der letzten `SELECT`-Anweisung können Sie statt `sum()` und `UNNEST` zu verwenden, die Verarbeitungszeit und die Datenübertragung, wie im folgenden Beispiel, mit `reduce()` verkürzen.

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
),
item AS (
  SELECT i AS array_items
  FROM dataset, UNNEST(items) AS t(i)
)
SELECT array_items, reduce(array_items, 0 , (s, x) -> s + x, s -> s) AS total
FROM item;
```

Jede Abfrage gibt die folgenden Ergebnisse zurück. Die Reihenfolge der zurückgegebenen Ergebnisse ist nicht gewährleistet.

```
+----------------------+
| array_items  | total |
+----------------------+
| [1, 2, 3, 4] | 10    |
| [5, 6, 7, 8] | 26    |
| [9, 0]       | 9     |
+----------------------+
```

# Arrays in Zeichenfolgen konvertieren
<a name="converting-arrays-to-strings"></a>

Zum Konvertieren eines Arrays in eine einzelne Zeichenfolge verwenden Sie die `array_join`-Funktion. Im folgenden eigenständigen Beispiel wird eine Tabelle namens `dataset` erstellt, die ein aliasiertes Array namens `words` enthält. Die Abfrage verwendet `array_join`, um die Array-Elemente in `words` zu verbinden, sie durch Leerzeichen zu trennen und die resultierende Zeichenfolge in einer Alias-Spalte namens `welcome_msg` zurückzugeben.

```
WITH
dataset AS (
  SELECT ARRAY ['hello', 'amazon', 'athena'] AS words
)
SELECT array_join(words, ' ') AS welcome_msg
FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+---------------------+
| welcome_msg         |
+---------------------+
| hello amazon athena |
+---------------------+
```

# Arrays zum Erstellen von Karten verwenden
<a name="arrays-create-maps"></a>

Zuordnungen sind Schlüssel-Wert-Paare, die aus einem in Athena verfügbaren Datentyp bestehen. Verwenden Sie zum Erstellen von Zuordnungen den `MAP`-Operator und übergeben Sie zwei Arrays: Das erste Array enthält die Spaltennamen (Schlüssel) und das zweite Array enthält die Werte. Alle Werte in den Arrays müssen denselben Typ haben. Wenn bestimmte Zuordnungswerte im Array einen anderen Typ benötigen, können Sie sie später umwandeln.

## Beispiele
<a name="examples"></a>

In diesem Beispiel wird ein Benutzer aus einem Dataset ausgewählt. Dem verwendeten `MAP`-Operator werden zwei Arrays übergeben. Das erste Array enthält Werte für die Spaltennamen wie "first", "last" und "age". Das zweite Array enthält die Werte für die einzelnen Spalten, z. B. "Bob", "Smith", "35".

```
WITH dataset AS (
  SELECT MAP(
    ARRAY['first', 'last', 'age'],
    ARRAY['Bob', 'Smith', '35']
  ) AS user
)
SELECT user FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+---------------------------------+
| user                            |
+---------------------------------+
| {last=Smith, first=Bob, age=35} |
+---------------------------------+
```

Sie können `Map`-Werte abrufen, indem Sie den Feldnamen gefolgt von `[key_name]` wie in diesem Beispiel auswählen:

```
WITH dataset AS (
 SELECT MAP(
   ARRAY['first', 'last', 'age'],
   ARRAY['Bob', 'Smith', '35']
 ) AS user
)
SELECT user['first'] AS first_name FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+------------+
| first_name |
+------------+
| Bob        |
+------------+
```

# Abfragen von Arrays mit komplexen Typen und verschachtelten Strukturen
<a name="rows-and-structs"></a>

Quelldaten enthalten oft Arrays mit komplexen Datentypen und verschachtelten Strukturen. In den Beispielen in diesem Abschnitt wird gezeigt, wie Sie mit Athena-Abfragen den Datentyp eines Elements ändern, Elemente in einem Array finden und Schlüsselwörter finden können.

**Topics**
+ [Erstellen eines `ROW`](creating-row.md)
+ [Ändern von Feldnamen in Arrays mit `CAST`](changing-row-arrays-with-cast.md)
+ [Filtern von Arrays mit der `.`-Notation](filtering-with-dot.md)
+ [Filtern von Arrays mit verschachtelten Werten](filtering-nested-with-dot.md)
+ [Filtern von Arrays mit `UNNEST`](filtering-with-unnest.md)
+ [Suchen nach Schlüsselwörtern in Arrays mithilfe von `regexp_like`](filtering-with-regexp.md)

# Erstellen eines `ROW`
<a name="creating-row"></a>

**Anmerkung**  
In den Beispielen in diesem Abschnitt wird `ROW` verwendet, um Beispieldaten zu erstellen. Wenn Sie Tabellen mit Athena abfragen, müssen Sie keine `ROW`-Datentypen erstellen, da sie bereits aus Ihrer Datenquelle erstellt wurden. Wenn Sie `CREATE_TABLE` verwenden, definiert Athena eine `STRUCT` darin, füllt sie mit Daten und erstellt für jede Zeile in einem Dataset den `ROW`-Datentyp für Sie. Der zugrunde liegende `ROW`-Datentyp besteht aus benannten Feldern beliebiger unterstützter SQL-Datentypen.

```
WITH dataset AS (
 SELECT
   ROW('Bob', 38) AS users
 )
SELECT * FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+-------------------------+
| users                   |
+-------------------------+
| {field0=Bob, field1=38} |
+-------------------------+
```

# Ändern von Feldnamen in Arrays mit `CAST`
<a name="changing-row-arrays-with-cast"></a>

Verwenden Sie zum Ändern des Feldnamens in einem Array, das `ROW`-Werte enthält, eine `CAST`-Anweisung für die `ROW`-Deklaration:

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)
    ) AS users
)
SELECT * FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------------+
| users              |
+--------------------+
| {NAME=Bob, AGE=38} |
+--------------------+
```

**Anmerkung**  
Im obigen Beispiel deklarieren Sie `name` als `VARCHAR`, da dies der Datentyp in Presto ist. Wenn Sie dieses `STRUCT` innerhalb einer `CREATE TABLE`-Anweisung deklarieren, verwenden Sie den Datentyp `String`, da Hive diesen Datentyp als `String` definiert.

# Filtern von Arrays mit der `.`-Notation
<a name="filtering-with-dot"></a>

Wählen Sie im folgenden Beispiel das `accountId` Feld aus der `userIdentity` Spalte einer AWS CloudTrail Protokolltabelle mithilfe der `.` Punktnotation aus. Weitere Informationen finden Sie unter [AWS CloudTrail Logs abfragen](cloudtrail-logs.md).

```
SELECT
  CAST(useridentity.accountid AS bigint) as newid
FROM cloudtrail_logs
LIMIT 2;
```

Diese Abfrage gibt Folgendes zurück:

```
+--------------+
| newid        |
+--------------+
| 112233445566 |
+--------------+
| 998877665544 |
+--------------+
```

Um ein Array mit Werten abzufragen, senden Sie diese Abfrage:

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)),
    CAST(ROW('Alice', 35) AS ROW(name VARCHAR, age INTEGER)),
    CAST(ROW('Jane', 27) AS ROW(name VARCHAR, age INTEGER))
  ] AS users
)
SELECT * FROM dataset
```

Sie erhalten das folgende Ergebnis:

```
+-----------------------------------------------------------------+
| users                                                           |
+-----------------------------------------------------------------+
| [{NAME=Bob, AGE=38}, {NAME=Alice, AGE=35}, {NAME=Jane, AGE=27}] |
+-----------------------------------------------------------------+
```

# Filtern von Arrays mit verschachtelten Werten
<a name="filtering-nested-with-dot"></a>

Große Arrays enthalten oft verschachtelte Strukturen und Sie müssen die darin enthaltenen Werte filtern oder suchen können.

Um ein Dataset für ein Array mit Werten zu definieren, das einen verschachtelten `BOOLEAN`-Wert enthält, senden Sie die folgende Abfrage:

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ) AS sites
)
SELECT * FROM dataset
```

Sie erhalten das folgende Ergebnis:

```
+----------------------------------------------------------+
| sites                                                    |
+----------------------------------------------------------+
| {HOSTNAME=aws.amazon.com, FLAGGEDACTIVITY={ISNEW=true}}  |
+----------------------------------------------------------+
```

Verwenden Sie nun zum Filtern von und Zugreifen auf den `BOOLEAN`-Wert dieses Elements die Punkt-`.`-Notation.

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ) AS sites
)
SELECT sites.hostname, sites.flaggedactivity.isnew
FROM dataset
```

Mit dieser Abfrage werden die verschachtelten Felder ausgewählt und folgendes Ergebnis zurückgegeben:

```
+------------------------+
| hostname       | isnew |
+------------------------+
| aws.amazon.com | true  |
+------------------------+
```

# Filtern von Arrays mit `UNNEST`
<a name="filtering-with-unnest"></a>

Um ein Array mit einer verschachtelten Struktur nach einem untergeordneten Element zu filtern, verwenden Sie eine Abfrage mit einem `UNNEST`-Operator. Weitere Informationen zu `UNNEST` finden Sie unter [Reduzieren von verschachtelten Arrays](flattening-arrays.md).

Diese Abfrage sucht beispielsweise Hostnamen von Websites im Datensatz.

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('news.cnn.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('netflix.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    )
  ] as items
)
SELECT sites.hostname, sites.flaggedActivity.isNew
FROM dataset, UNNEST(items) t(sites)
WHERE sites.flaggedActivity.isNew = true
```

Folgendes wird zurückgegeben:

```
+------------------------+
| hostname       | isnew |
+------------------------+
| aws.amazon.com | true  |
+------------------------+
```

# Suchen nach Schlüsselwörtern in Arrays mithilfe von `regexp_like`
<a name="filtering-with-regexp"></a>

Die folgenden Beispiele veranschaulichen, wie Sie mit der Funktion [regexp\$1like](https://prestodb.io/docs/current/functions/regexp.html) ein Dataset nach einem Schlüsselwort innerhalb eines Elements in einem Array durchsuchen. Sie übernimmt als Eingabe ein auszuwertendes reguläres Ausdrucksmuster oder eine Liste von Begriffen, die durch einen senkrechten Strich (\$1) voneinander getrennt sind, und bestimmt, ob diese Eingabe in der angegebenen Zeichenfolge enthalten ist.

Das reguläre Ausdrucksmuster muss innerhalb der Zeichenfolge enthalten sein, braucht aber nicht genau mit ihr übereinzustimmen. Wenn es mit der gesamten Zeichenfolge übereinstimmen soll, setzen Sie das Muster zwischen ein ^ am Anfang und ein \$1 am Ende, z. B. `'^pattern$'`.

Stellen Sie sich ein Array von Websites mit deren Hostname und einem `flaggedActivity`-Element vor. Dieses Element enthält ein `ARRAY` mit mehreren `MAP`-Elementen, die jeweils beliebte Schlüsselwörter und deren Beliebtheitswert enthalten. Angenommen, Sie möchten ein bestimmtes Schlüsselwort innerhalb einer `MAP` in diesem Array finden.

Um dieses Dataset nach Websites mit einem bestimmten Schlüsselwort zu durchsuchen, verwenden Sie `regexp_like` anstelle des ähnlichen SQL-`LIKE`-Operators, da die Suche nach einer großen Anzahl von Schlüsselwörtern mit `regexp_like` effizienter ist.

**Example Beispiel 1: Verwenden von `regexp_like`**  
Die Abfrage in diesem Beispiel sucht mit der Funktion `regexp_like` nach den Begriffen `'politics|bigdata'` in den Werten innerhalb des Arrays:  

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(ARRAY[
          MAP(ARRAY['term', 'count'], ARRAY['bigdata', '10']),
          MAP(ARRAY['term', 'count'], ARRAY['serverless', '50']),
          MAP(ARRAY['term', 'count'], ARRAY['analytics', '82']),
          MAP(ARRAY['term', 'count'], ARRAY['iot', '74'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   ),
   CAST(
     ROW('news.cnn.com', ROW(ARRAY[
       MAP(ARRAY['term', 'count'], ARRAY['politics', '241']),
       MAP(ARRAY['term', 'count'], ARRAY['technology', '211']),
       MAP(ARRAY['term', 'count'], ARRAY['serverless', '25']),
       MAP(ARRAY['term', 'count'], ARRAY['iot', '170'])
     ])
     ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   ),
   CAST(
     ROW('netflix.com', ROW(ARRAY[
       MAP(ARRAY['term', 'count'], ARRAY['cartoons', '1020']),
       MAP(ARRAY['term', 'count'], ARRAY['house of cards', '112042']),
       MAP(ARRAY['term', 'count'], ARRAY['orange is the new black', '342']),
       MAP(ARRAY['term', 'count'], ARRAY['iot', '4'])
     ])
     ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   )
 ] AS items
),
sites AS (
  SELECT sites.hostname, sites.flaggedactivity
  FROM dataset, UNNEST(items) t(sites)
)
SELECT hostname
FROM sites, UNNEST(sites.flaggedActivity.flags) t(flags)
WHERE regexp_like(flags['term'], 'politics|bigdata')
GROUP BY (hostname)
```
Diese Abfrage gibt zwei Websites zurück:  

```
+----------------+
| hostname       |
+----------------+
| aws.amazon.com |
+----------------+
| news.cnn.com   |
+----------------+
```

**Example Beispiel 2: Verwenden von `regexp_like`**  
Bei der Abfrage im folgenden Beispiel werden die Gesamtbeliebtheitswerte für die Websites, die mit Ihren Suchbegriffen übereinstimmen, mit der Funktion `regexp_like` addiert und dann von hoch nach niedrig sortiert.   

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(ARRAY[
          MAP(ARRAY['term', 'count'], ARRAY['bigdata', '10']),
          MAP(ARRAY['term', 'count'], ARRAY['serverless', '50']),
          MAP(ARRAY['term', 'count'], ARRAY['analytics', '82']),
          MAP(ARRAY['term', 'count'], ARRAY['iot', '74'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    ),
    CAST(
      ROW('news.cnn.com', ROW(ARRAY[
        MAP(ARRAY['term', 'count'], ARRAY['politics', '241']),
        MAP(ARRAY['term', 'count'], ARRAY['technology', '211']),
        MAP(ARRAY['term', 'count'], ARRAY['serverless', '25']),
        MAP(ARRAY['term', 'count'], ARRAY['iot', '170'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    ),
    CAST(
      ROW('netflix.com', ROW(ARRAY[
        MAP(ARRAY['term', 'count'], ARRAY['cartoons', '1020']),
        MAP(ARRAY['term', 'count'], ARRAY['house of cards', '112042']),
        MAP(ARRAY['term', 'count'], ARRAY['orange is the new black', '342']),
        MAP(ARRAY['term', 'count'], ARRAY['iot', '4'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    )
  ] AS items
),
sites AS (
  SELECT sites.hostname, sites.flaggedactivity
  FROM dataset, UNNEST(items) t(sites)
)
SELECT hostname, array_agg(flags['term']) AS terms, SUM(CAST(flags['count'] AS INTEGER)) AS total
FROM sites, UNNEST(sites.flaggedActivity.flags) t(flags)
WHERE regexp_like(flags['term'], 'politics|bigdata')
GROUP BY (hostname)
ORDER BY total DESC
```
Diese Abfrage gibt zwei Websites zurück:  

```
+------------------------------------+
| hostname       | terms    | total  |
+----------------+-------------------+
| news.cnn.com   | politics |  241   |
+----------------+-------------------+
| aws.amazon.com | bigdata |  10    |
+----------------+-------------------+
```

# Geodaten abfragen
<a name="querying-geospatial-data"></a>

Koordinatenbasierte Daten enthalten Kennungen, die eine geografische Position für ein Objekt angeben. Zu den Beispielen für diese Art von Daten zählen Wetterberichte, Wegbeschreibungen, Tweets mit geografischen Positionen, Filialstandorte und Flugrouten. Koordinatenbasierte Daten spielen eine wichtige Rolle bei Geschäftsanalysen, der Berichterstattung und bei Vorhersagen.

Geografische Kennungen, wie z. B. Längen- und Breitengrade, ermöglichen das Umwandeln von Postanschriften in geografische Koordinaten.

## Was ist eine koordinatenbasierte Abfrage?
<a name="geospatial-query-what-is"></a>

Koordinatenbasierte Abfragen sind spezielle SQL-Abfragen, die in Athena unterstützt werden. Sie unterscheiden sich von nicht koordinatenbezogenen SQL-Abfragen wie folgt:
+ Verwendung der folgenden spezialisierten Geometrie-Datentypen: `point``line`, `multiline`, `polygon` und `multipolygon`.
+ Angeben von Beziehungen zwischen Geometrie-Datentypen wie `distance`, `equals`, `crosses`, `touches`, `overlaps`, `disjoint` und anderen.

Mit koordinatenbasierten Abfragen in Athena können Sie diese und ähnliche Operationen ausführen:
+ Ermitteln Sie den Abstand zwischen zwei Punkten.
+ Überprüfen Sie, ob ein Bereich (Polygon) ein weiteres enthält.
+ Feststellen, ob eine Linie eine andere oder ein Polygon berührt oder schneidet.

Um beispielsweise einen Geometriedatentyp `point` aus Werten des Typs `double` für die geografischen Koordinaten des Mount Rainier in Athena zu erhalten, verwenden Sie die Geodatenfunktion `ST_Point (longitude, latitude)` wie im folgenden Beispiel. 

```
ST_Point(-121.7602, 46.8527)
```

## Eingabedatenformate und Geometrie-Datentypen
<a name="geospatial-input-data-formats-supported-geometry-types"></a>

Um Geodatenfunktionen in Athena zu verwenden, geben Sie Ihre Daten im WKT-Format ein oder verwenden Sie Hive-JSON. SerDe Sie können auch die in Athena unterstützten Geometrie-Datentypen nutzen.

### Eingabedatenformate
<a name="input-data-formats"></a>

Zur Verarbeitung von koordinatenbasierten Abfragen unterstützt Athena Eingabedaten in diesen Datenformaten:
+  **WKT (Well-known Text)**. In Athena wird WKT als `varchar(x)`- oder `string`-Datentyp dargestellt.
+  **JSON-kodierte koordinatenbasierte Daten**. [Um JSON-Dateien mit Geodaten zu analysieren und Tabellen für sie zu erstellen, verwendet Athena Hive-JSON. SerDe](https://github.com/Esri/spatial-framework-for-hadoop/wiki/Hive-JSON-SerDe) Weitere Hinweise zur Verwendung SerDe in Athena finden Sie unter[SerDe JSON-Bibliotheken](json-serde.md).

### Geometrie-Datentypen
<a name="geometry-data-types"></a>

Zur Verarbeitung von koordinatenbasierten Abfragen unterstützt Athena diese speziellen Geometrie-Datentypen:
+  `point` 
+  `line` 
+  `polygon` 
+  `multiline` 
+  `multipolygon` 

## Unterstützte koordinatenbasierte Funktionen
<a name="geospatial-functions-list"></a>

Weitere Informationen zu den Geodatenfunktionen in Athena-Engine-Version 3 finden Sie unter [Geodatenfunktionen](https://trino.io/docs/current/functions/geospatial.html) in der Trino-Dokumentation.

# Beispiele: Koordinatenbasierte Abfragen
<a name="geospatial-example-queries"></a>

Die Beispiele in diesem Thema erstellen zwei Tabellen aus Beispieldaten, die auf verfügbar sind, GitHub und fragen die Tabellen auf der Grundlage der Daten ab. Die Beispieldaten, die nur zu Illustrationszwecken dienen und nicht garantiert korrekt sind, befinden sich in den folgenden Dateien:
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv)** – Führt Erdbeben auf, die sich in Kalifornien ereignet haben. In der `earthquakes`-Beispieltabelle werden Felder aus diesen Daten verwendet.
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json)** – Führt Daten auf Landkreisebene für den Bundesstaat Kalifornien im [ESRI-gemäßen GeoJSON-Format](https://doc.arcgis.com/en/arcgis-online/reference/geojson.htm) auf. Die Daten beinhalten zahlreiche Felder wie `AREA`, `PERIMETER`, `STATE`, `COUNTY` und `NAME`, aber die `counties`-Beispieltabelle verwendet nur zwei: `Name` (Zeichenfolge) und `BoundaryShape` (binär). 
**Anmerkung**  
Athena verwendet die `com.esri.json.hadoop.EnclosedEsriJsonInputFormat`, um die JSON-Daten in das koordinatenbasierte Binärformat zu konvertieren.

Mit dem folgenden Code-Beispiel wird eine Tabelle namens `earthquakes` erstellt:

```
CREATE external TABLE earthquakes
(
 earthquake_date string,
 latitude double,
 longitude double,
 depth double,
 magnitude double,
 magtype string,
 mbstations string,
 gap string,
 distance string,
 rms string,
 source string,
 eventid string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE LOCATION 's3://amzn-s3-demo-bucket/my-query-log/csv/';
```

Mit dem folgenden Code-Beispiel wird eine Tabelle namens `counties` erstellt:

```
CREATE external TABLE IF NOT EXISTS counties
 (
 Name string,
 BoundaryShape binary
 )
ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.EsriJsonSerDe'
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedEsriJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/my-query-log/json/';
```

Die folgende Beispielabfrage verwendet die Funktion `CROSS JOIN` für die `counties`- und `earthquake`-Tabellen. Im Beispiel wird `ST_CONTAINS` verwendet, um nach Landkreisen abzufragen, deren Grenzen Erdbebenstandorte enthalten, die mit `ST_POINT` angegeben sind. Die Abfrage gruppiert solche Landkreise nach Namen, ordnet sie nach Anzahl und gibt sie in absteigender Reihenfolge zurück.

```
SELECT counties.name,
        COUNT(*) cnt
FROM counties
CROSS JOIN earthquakes
WHERE ST_CONTAINS (ST_GeomFromLegacyBinary(counties.boundaryshape), ST_POINT(earthquakes.longitude, earthquakes.latitude))
GROUP BY  counties.name
ORDER BY  cnt DESC
```

Diese Abfrage gibt Folgendes zurück:

```
+------------------------+
| name             | cnt |
+------------------------+
| Kern             | 36  |
+------------------------+
| San Bernardino   | 35  |
+------------------------+
| Imperial         | 28  |
+------------------------+
| Inyo             | 20  |
+------------------------+
| Los Angeles      | 18  |
+------------------------+
| Riverside        | 14  |
+------------------------+
| Monterey         | 14  |
+------------------------+
| Santa Clara      | 12  |
+------------------------+
| San Benito       | 11  |
+------------------------+
| Fresno           | 11  |
+------------------------+
| San Diego        | 7   |
+------------------------+
| Santa Cruz       | 5   |
+------------------------+
| Ventura          | 3   |
+------------------------+
| San Luis Obispo  | 3   |
+------------------------+
| Orange           | 2   |
+------------------------+
| San Mateo        | 1   |
+------------------------+
```

## Weitere Ressourcen
<a name="geospatial-example-queries-additional-resources"></a>

Weitere Beispiele für koordinatenbasierte Abfragen finden Sie in den folgenden Blogbeiträgen:
+ [Erweitern Sie Geodatenabfragen in Amazon Athena mit und UDFs AWS Lambda](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/) 
+ [Visualisieren Sie globale Klimadaten aus über 200 Jahren mit Amazon Athena und Amazon Quick](https://aws.amazon.com/blogs/big-data/visualize-over-200-years-of-global-climate-data-using-amazon-athena-and-amazon-quicksight/).
+ [Abfragen OpenStreetMap mit Amazon Athena](https://aws.amazon.com/blogs/big-data/querying-openstreetmap-with-amazon-athena/)

# JSON-Daten abfragen
<a name="querying-JSON"></a>

Mit Amazon Athena können Sie JSON-kodierte Werte abfragen, Daten aus verschachtelten JSON-Daten extrahieren, nach Werten suchen und die Länge und Größe von JSON-Arrays ermitteln. Betrachten Sie die folgenden Beispielplanetendaten, um die Grundlagen der Abfrage von JSON-Daten in Athena zu erlernen:

```
{name:"Mercury",distanceFromSun:0.39,orbitalPeriod:0.24,dayLength:58.65}
{name:"Venus",distanceFromSun:0.72,orbitalPeriod:0.62,dayLength:243.02}
{name:"Earth",distanceFromSun:1.00,orbitalPeriod:1.00,dayLength:1.00}
{name:"Mars",distanceFromSun:1.52,orbitalPeriod:1.88,dayLength:1.03}
```

Beachten Sie, dass jeder Datensatz (im Grunde jede Zeile in der Tabelle) in einer separaten Zeile steht. Um diese JSON-Daten abzufragen, können Sie eine `CREATE TABLE`-Anweisung wie die folgende verwenden:

```
CREATE EXTERNAL TABLE `planets_json`(
  `name` string,
  `distancefromsun` double,
  `orbitalperiod` double,
  `daylength` double)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/json/'
```

Verwenden Sie eine einfache `SELECT`-Anweisung wie das folgende Beispiel, um die Daten abzufragen.

```
SELECT * FROM planets_json
```

Die Abfrageergebnisse sehen wie folgt aus.


****  

| \$1 | Name | distancefromsun | orbitalperiod | daylength | 
| --- | --- | --- | --- | --- | 
| 1 | Merkur | 0,39 | 0,24 | 58,65 | 
| 2 | Venus | 0,72 | 0,62 | 243,02 | 
| 3 | Erde | 1,0 | 1,0 | 1,0 | 
| 4 | Mars | 1,52 | 1,88 | 1,03 | 

Beachten Sie, wie die `CREATE TABLE`-Anweisung [OpenX JSON SerDe](openx-json-serde.md) verwendet, wodurch jeder JSON-Datensatz in einer separaten Zeile stehen muss. Wenn das JSON in einem hübschen Druckformat vorliegt oder wenn alle Datensätze in einer einzigen Zeile stehen, werden die Daten nicht korrekt gelesen.

Um JSON-Daten abzufragen, die in einem hübschen Druckformat vorliegen, können Sie [Amazon Ion Hive SerDe](ion-serde.md) anstelle von OpenX JSON SerDe das verwenden. Betrachten Sie die vorherigen Daten, die im hübschen Druckformat gespeichert wurden:

```
{
  name:"Mercury",
  distanceFromSun:0.39,
  orbitalPeriod:0.24,
  dayLength:58.65
}
{
  name:"Venus",
  distanceFromSun:0.72,
  orbitalPeriod:0.62,
  dayLength:243.02
}
{
  name:"Earth",
  distanceFromSun:1.00,
  orbitalPeriod:1.00,
  dayLength:1.00
}
{
  name:"Mars",
  distanceFromSun:1.52,
  orbitalPeriod:1.88,
  dayLength:1.03
}
```

Um diese Daten ohne Neuformatierung abzufragen, können Sie eine `CREATE TABLE`-Anweisung wie die folgende verwenden. Beachten Sie, dass die Anweisung nicht das OpenX-JSON spezifiziert SerDe, sondern spezifiziert`STORED AS ION`. 

```
CREATE EXTERNAL TABLE `planets_ion`(
  `name` string,
  `distancefromsun` DECIMAL(10, 2),
  `orbitalperiod` DECIMAL(10, 2),
  `daylength` DECIMAL(10, 2))
STORED AS ION
LOCATION
  's3://amzn-s3-demo-bucket/json-ion/'
```

Die Abfrage `SELECT * FROM planets_ion` liefert dieselben Ergebnisse wie zuvor. Weitere Informationen zum Erstellen von Tabellen auf diese Weise mithilfe von Amazon Ion Hive finden Sie SerDe unter[Amazon-Ion-Tabellen erstellen](ion-serde-using-create-table.md).

Das vorherige Beispiel für JSON-Daten enthält keine komplexen Datentypen wie verschachtelte Arrays oder Strukturen. Weitere Informationen zur Verwendung der Abfrage von verschachtelten JSON-Daten finden Sie unter [Beispiel: Deserialisierung von verschachteltem JSON](openx-json-serde.md#nested-json-serde-example).

**Topics**
+ [Bewährte Methoden zum Lesen von JSON-Daten](parsing-json-data.md)
+ [Extrahieren Sie JSON-Daten aus Zeichenfolgen](extracting-data-from-JSON.md)
+ [Suchen nach Werten in JSON-Arrays](searching-for-values.md)
+ [Abrufen der Länge und Größe von JSON-Arrays](length-and-size.md)
+ [Fehlerbehebung für JSON-Abfragen](json-troubleshooting.md)

# Bewährte Methoden zum Lesen von JSON-Daten
<a name="parsing-json-data"></a>

JavaScript Object Notation (JSON) ist eine gängige Methode zur Kodierung von Datenstrukturen als Text. Viele Anwendungen und Tools geben Daten im JSON-Format aus.

In Amazon Athena können Sie Tabellen aus externen Daten erstellen und die JSON-kodierten Daten darin einschließen. Verwenden Sie für solche Arten von Quelldaten Athena zusammen mit [SerDe JSON-Bibliotheken](json-serde.md). 

Nutzen Sie die folgenden Tipps, um JSON-kodierte Daten zu lesen:
+ Wählen Sie das richtige SerDe, ein natives JSON SerDe oder ein OpenX SerDe,`org.openx.data.jsonserde.JsonSerDe`. `org.apache.hive.hcatalog.data.JsonSerDe` Weitere Informationen finden Sie unter [SerDe JSON-Bibliotheken](json-serde.md).
+ Stellen Sie sicher, dass jeder JSON-codierte Datensatz in einer separaten Zeile dargestellt wird, nicht hübsch gedruckt.
**Anmerkung**  
Das SerDe erwartet, dass sich jedes JSON-Dokument in einer einzigen Textzeile ohne Zeilenabschlusszeichen befindet, die die Felder im Datensatz trennen. Wenn der JSON-Text ein hübsches Druckformat hat, erhalten Sie möglicherweise eine Fehlermeldung wie HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object oder HIVE\$1CURSOR\$1ERROR:: Unerwartet JsonParseException end-of-input: erwarteter Schließpunkt für OBJECT, wenn Sie versuchen, die Tabelle nach ihrer Erstellung abzufragen. Weitere Informationen finden Sie unter [JSON-Datendateien](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) in der SerDe OpenX-Dokumentation unter GitHub. 
+ Generieren Sie die JSON-kodierten Daten in Spalten (ohne Berücksichtigung von Groß-/Kleinschreibung).
+ Binden Sie eine Option zum Ignorieren fehlerhafter Datensätze (wie in diesem Beispiel) ein.

  ```
  CREATE EXTERNAL TABLE json_table (
    column_a string,
    column_b int
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
   LOCATION 's3://amzn-s3-demo-bucket/path/';
  ```
+ Konvertieren Sie Felder der Quelldaten, die ein unbestimmtes Schema haben, in JSON-Zeichenfolgen in Athena.

Wenn Athena Tabellen basierend auf JSON-Daten erstellt, werden die Daten basierend auf vorhandenen und vordefinierten Schemata analysiert. Es verfügen jedoch möglicherweise nicht alle Ihre Daten über ein vordefiniertes Schema. Um die Schemaverwaltung in solchen Fällen zu vereinfachen, ist es oft hilfreich, Felder in Quelldaten, die ein unbestimmtes Schema haben, zu JSON-Zeichenfolgen in Athena zu konvertieren und dann [SerDe JSON-Bibliotheken](json-serde.md) zu verwenden.

Nehmen wir als Beispiel eine IoT-Anwendung, die Ereignisse mit gängigen Feldern von verschiedenen Sensoren veröffentlicht. In einem dieser Felder muss eine benutzerdefinierte Nutzlast gespeichert werden, die für den Sensor, der das Ereignis sendet, eindeutig ist. Da Sie in diesem Fall das Schema nicht kennen, empfehlen wir, die Information als JSON-kodierte Zeichenfolge zu speichern. Konvertieren Sie hierfür die Daten in Ihrer Athena-Tabelle in das JSON-Format, wie im folgenden Beispiel dargestellt. Sie können JSON-kodierte Daten auch in Athena-Datentypen konvertieren.

**Topics**
+ [Athena-Datentypen in JSON konvertieren](converting-native-data-types-to-json.md)
+ [JSON- in Athena-Datentypen konvertieren](converting-json-to-native-data-types.md)

# Athena-Datentypen in JSON konvertieren
<a name="converting-native-data-types-to-json"></a>

Verwenden Sie `CAST`, um Athena-Datentypen in JSON zu konvertieren.

```
WITH dataset AS (
  SELECT
    CAST('HELLO ATHENA' AS JSON) AS hello_msg,
    CAST(12345 AS JSON) AS some_int,
    CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map
)
SELECT * FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+-------------------------------------------+
| hello_msg      | some_int | some_map      |
+-------------------------------------------+
| "HELLO ATHENA" | 12345    | {"a":1,"b":2} |
+-------------------------------------------+
```

# JSON- in Athena-Datentypen konvertieren
<a name="converting-json-to-native-data-types"></a>

Verwenden Sie `CAST`, um JSON-Daten in Athena-Datentypen zu konvertieren.

**Anmerkung**  
Um in diesem Beispiel Zeichenfolgen als JSON-kodiert zu kennzeichnen, beginnen Sie mit dem `JSON`-Schlüsselwort und verwenden Sie einfache Anführungszeichen wie `JSON '12345'`. 

```
WITH dataset AS (
  SELECT
    CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg,
    CAST(JSON '12345' AS INTEGER) AS some_int,
    CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map
)
SELECT * FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+-------------------------------------+
| hello_msg    | some_int | some_map  |
+-------------------------------------+
| HELLO ATHENA | 12345    | {a:1,b:2} |
+-------------------------------------+
```

# Extrahieren Sie JSON-Daten aus Zeichenfolgen
<a name="extracting-data-from-JSON"></a>

Möglicherweise verfügen Sie über Quelldaten mit JSON-kodierten Zeichenfolgen, die Sie nicht in eine Tabelle in Athena deserialisieren möchten. In diesem Fall können Sie mit den JSON-Funktionen in Presto dennoch SQL-Operationen für diese Daten ausführen.

Betrachten Sie diese JSON-Zeichenfolge als Beispiel-Dataset.

```
{"name": "Susan Smith",
"org": "engineering",
"projects":
    [
     {"name":"project1", "completed":false},
     {"name":"project2", "completed":true}
    ]
}
```

## Beispiele: Extrahieren von Eigenschaften
<a name="examples-extracting-properties"></a>

Um die Eigenschaften `name` und `projects` aus der JSON-Zeichenfolge zu extrahieren, verwenden Sie die Funktion `json_extract` wie im folgenden Beispiel. Die Funktion `json_extract` übernimmt die Spalte mit der JSON-Zeichenfolge und durchsucht sie mit einem `JSONPath`-artigen Ausdruck in der Punkt-`.`-Notation.

**Anmerkung**  
 `JSONPath` führt einen einfachen Strukturdurchlauf aus. Dabei wird das Stammverzeichnis des JSON-Dokuments mit `$` bezeichnet, gefolgt von einem Punkt und einem direkt unterhalb des Stammverzeichnisses verschachtelten Elements wie `$.name`.

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},
           {"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract(myblob, '$.name') AS name,
  json_extract(myblob, '$.projects') AS projects
FROM dataset
```

Der zurückgegebene Wert ist eine JSON-kodierte Zeichenfolge und kein nativer Athena-Datentyp.

```
+-----------------------------------------------------------------------------------------------+
| name           | projects                                                                     |
+-----------------------------------------------------------------------------------------------+
| "Susan Smith"  | [{"name":"project1","completed":false},{"name":"project2","completed":true}] |
+-----------------------------------------------------------------------------------------------+
```

Verwenden Sie zum Extrahieren von skalaren Werten aus der JSON-Zeichenfolge die Funktion `json_extract_scalar(json, json_path)`. Es ist ähnlich wie `json_extract`, gibt aber einen `varchar`-Zeichenfolgenwert anstelle einer JSON-kodierten Zeichenfolge zurück. Der Wert für den *json\$1path* Parameter muss ein Skalar sein (ein boolescher Wert, eine Zahl oder eine Zeichenfolge).

**Anmerkung**  
Verwenden Sie die Funktion `json_extract_scalar` nicht für Arrays, Zuordnungen oder Strukturen.

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract_scalar(myblob, '$.name') AS name,
  json_extract_scalar(myblob, '$.projects') AS projects
FROM dataset
```

Diese Abfrage gibt Folgendes zurück:

```
+---------------------------+
| name           | projects |
+---------------------------+
| Susan Smith    |          |
+---------------------------+
```

Um das erste Element der Eigenschaft `projects` in dem Beispiel-Array abzurufen, verwenden Sie die Funktion `json_array_get` und geben Sie die Indexposition an.

```
WITH dataset AS (
  SELECT '{"name": "Bob Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT json_array_get(json_extract(myblob, '$.projects'), 0) AS item
FROM dataset
```

Es wird der Wert an der angegebenen Indexposition in dem JSON-kodierten Array zurückgegeben.

```
+---------------------------------------+
| item                                  |
+---------------------------------------+
| {"name":"project1","completed":false} |
+---------------------------------------+
```

Um einen Athena-Zeichenfolgetyp zurückzugeben, verwenden Sie den `[]`-Operator in einem `JSONPath`-Ausdruck und verwenden Sie anschließend die Funktion `json_extract_scalar`. Mehr über `[]` erfahren Sie unter [Auf Array-Elemente zugreifen](accessing-array-elements.md).

```
WITH dataset AS (
   SELECT '{"name": "Bob Smith",
             "org": "engineering",
             "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
     AS myblob
)
SELECT json_extract_scalar(myblob, '$.projects[0].name') AS project_name
FROM dataset
```

Sie erhalten das folgende Ergebnis:

```
+--------------+
| project_name |
+--------------+
| project1     |
+--------------+
```

# Suchen nach Werten in JSON-Arrays
<a name="searching-for-values"></a>

Um zu ermitteln, ob ein bestimmter Wert in einem JSON-kodierten Array vorhanden ist, nutzen Sie die `json_array_contains`-Funktion.

Die folgende Abfrage führt die Namen der Benutzer auf, die an "project2" teilnehmen.

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith", "org": "legal", "projects": ["project1"]}'),
    (JSON '{"name": "Susan Smith", "org": "engineering", "projects": ["project1", "project2", "project3"]}'),
    (JSON '{"name": "Jane Smith", "org": "finance", "projects": ["project1", "project2"]}')
  ) AS t (users)
)
SELECT json_extract_scalar(users, '$.name') AS user
FROM dataset
WHERE json_array_contains(json_extract(users, '$.projects'), 'project2')
```

Diese Abfrage gibt eine Liste von Benutzern zurück.

```
+-------------+
| user        |
+-------------+
| Susan Smith |
+-------------+
| Jane Smith  |
+-------------+
```

Die folgende Beispielabfragespiel listet die Namen von Benutzern auf, die Projekte abgeschlossen haben, einschließlich der Anzahl abgeschlossener Projekte. Folgende Aktionen werden durchgeführt:
+ Verwendet zum Zwecke der Übersicht `SELECT`-Anweisungen.
+ Extrahiert das Projekt-Array.
+ Wandelt das Array mittels `CAST` in einen nativen Array von Schlüssel/Wert-Paaren um.
+ Extrahiert jedes einzelne Array-Element mit dem `UNNEST`-Operator.
+ Filtert abgerufene Werte nach abgeschlossenen Projekten und zählt diese.

**Anmerkung**  
Wenn Sie `CAST` zum `MAP` verwenden, können Sie das Schlüsselelement als `VARCHAR` (native Zeichenfolge in Presto) angeben, behalten aber den Wert als JSON bei, da die Werte in `MAP` unterschiedliche Typen aufweisen: Das erste Schlüssel/Wert-Paar ist ein Zeichenfolgenwert und das zweite ein boolescher.

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith",
             "org": "legal",
             "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith",
             "org": "engineering",
             "projects": [{"name":"project2", "completed":true},
                          {"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith",
             "org": "finance",
             "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
),
employees AS (
  SELECT users, CAST(json_extract(users, '$.projects') AS
    ARRAY(MAP(VARCHAR, JSON))) AS projects_array
  FROM dataset
),
names AS (
  SELECT json_extract_scalar(users, '$.name') AS name, projects
  FROM employees, UNNEST (projects_array) AS t(projects)
)
SELECT name, count(projects) AS completed_projects FROM names
WHERE cast(element_at(projects, 'completed') AS BOOLEAN) = true
GROUP BY name
```

Diese Abfrage gibt das folgende Ergebnis zurück:

```
+----------------------------------+
| name        | completed_projects |
+----------------------------------+
| Susan Smith | 2                  |
+----------------------------------+
| Jane Smith  | 1                  |
+----------------------------------+
```

# Abrufen der Länge und Größe von JSON-Arrays
<a name="length-and-size"></a>

Um die Länge und Größe von JSON-Arrays zu ermitteln, können Sie die `json_array_length`- und `json_size`-Funktionen verwenden.

## Beispiel: `json_array_length`
<a name="example-json-array-length"></a>

Um die Länge eines JSON-kodierten Arrays abzurufen, verwenden Sie die Funktion `json_array_length`.

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name":
            "Bob Smith",
            "org":
            "legal",
            "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith",
            "org": "engineering",
            "projects": [{"name":"project2", "completed":true},
                         {"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith",
             "org": "finance",
             "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
)
SELECT
  json_extract_scalar(users, '$.name') as name,
  json_array_length(json_extract(users, '$.projects')) as count
FROM dataset
ORDER BY count DESC
```

Diese Abfrage gibt das folgende Ergebnis zurück:

```
+---------------------+
| name        | count |
+---------------------+
| Susan Smith | 2     |
+---------------------+
| Bob Smith   | 1     |
+---------------------+
| Jane Smith  | 1     |
+---------------------+
```

## Beispiel: `json_size`
<a name="example-json-size"></a>

Um die Größe eines JSON-kodierten Arrays oder Objekts abzurufen, verwenden Sie die Funktion `json_size` und geben die Spalte an, die die JSON-Zeichenfolge und den `JSONPath`-Ausdruck zu dem Array oder Objekt enthält.

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith", "org": "legal", "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project2", "completed":true},{"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith", "org": "finance", "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
)
SELECT
  json_extract_scalar(users, '$.name') as name,
  json_size(users, '$.projects') as count
FROM dataset
ORDER BY count DESC
```

Diese Abfrage gibt das folgende Ergebnis zurück:

```
+---------------------+
| name        | count |
+---------------------+
| Susan Smith | 2     |
+---------------------+
| Bob Smith   | 1     |
+---------------------+
| Jane Smith  | 1     |
+---------------------+
```

# Fehlerbehebung für JSON-Abfragen
<a name="json-troubleshooting"></a>

Hilfe zur Fehlerbehebung für JSON-bezogene Abfragen finden Sie in [JSON-bezogene Fehler](troubleshooting-athena.md#troubleshooting-athena-json-related-errors) oder in den folgenden Ressourcen:
+ [Ich erhalte beim Lesen von JSON-Daten in Amazon Athena Fehlermeldungen.](https://aws.amazon.com/premiumsupport/knowledge-center/error-json-athena/)
+ [Wie behebe ich „HIVE\$1CURSOR\$1ERROR: Zeile ist kein gültiges JSON-Objekt - JSONException: Doppelter Schlüssel“ beim Lesen von Dateien aus Athena? AWS Config](https://aws.amazon.com/premiumsupport/knowledge-center/json-duplicate-key-error-athena-config/)
+ [Die Abfrage SELECT COUNT in Amazon Athena gibt einen einzigen Datensatz zurück, obwohl die JSON-Eingabedatei mehrere Datensätze enthält.](https://aws.amazon.com/premiumsupport/knowledge-center/select-count-query-athena-json-records/)
+ [Wie kann ich die Amazon S3-Quelldatei für eine Zeile in einer Athena-Tabelle anzeigen?](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/)

Siehe auch [Überlegungen und Einschränkungen für SQL-Abfragen in Amazon Athena](other-notable-limitations.md).

# Machine Learning (ML) mit Amazon Athena verwenden
<a name="querying-mlmodel"></a>

Mit Machine Learning (ML) mit Amazon Athena können Sie Athena verwenden, um SQL-Anweisungen zu schreiben, die Machine Learning (ML) -Inferenzen mithilfe von Amazon AI ausführen. SageMaker Dieses Feature vereinfacht den Zugriff auf ML-Modelle zum Zweck von Datenanalysen. Daher müssen keine komplexen Programmiermethoden verwendet werden, um Inferenzen auszuführen.

Um ML mit Athena zu verwenden, definieren Sie eine ML mit Athena Funktion mit der `USING EXTERNAL FUNCTION`-Klausel. Die Funktion verweist auf den SageMaker KI-Modellendpunkt, den Sie verwenden möchten, und spezifiziert die Variablennamen und Datentypen, die an das Modell übergeben werden sollen. Die folgenden Klauseln in der Abfrage verweisen auf die Funktion, um Werte an das Modell zu übergeben. Das Modell führt Inferenzen basierend auf den von der Abfrage übergebenen Werten aus und gibt anschließend Inferenzergebnisse zurück. Weitere Informationen zu SageMaker KI und zur Funktionsweise von SageMaker KI-Endpunkten finden Sie im [Amazon SageMaker AI Developer Guide](https://docs.aws.amazon.com/sagemaker/latest/dg/).

Ein Beispiel, das ML mit Athena und SageMaker KI-Inferenz verwendet, um einen anomalen Wert in einer Ergebnismenge zu erkennen, finden Sie im AWS Big Data-Blogartikel [Erkennen anomaler Werte durch Aufrufen](https://aws.amazon.com/blogs/big-data/detecting-anomalous-values-by-invoking-the-amazon-athena-machine-learning-inference-function/) der Amazon Athena Athena-Inferenzfunktion für maschinelles Lernen.

## Überlegungen und Einschränkungen
<a name="considerations-and-limitations"></a>
+ **Verfügbare Regionen** — Die Athena ML-Funktion ist dort verfügbar, AWS-Regionen wo Athena Engine Version 2 oder höher unterstützt wird.
+ SageMaker Der **Endpunkt des KI-Modells muss akzeptiert und zurückgegeben** werden `text/csv` — Weitere Informationen zu Datenformaten finden Sie unter [Common Data Formats for Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html) im *Amazon SageMaker AI Developer Guide*.
+ **Athena sendet keine CSV-Header** — Wenn Ihr SageMaker KI-Endpunkt dies ist`text/csv`, sollte Ihr Eingabe-Handler nicht davon ausgehen, dass die erste Zeile der Eingabe ein CSV-Header ist. Da Athena keine CSV-Header sendet, enthält die an Athena zurückgegebene Ausgabe eine Zeile weniger als von Athena erwartet, und verursacht einen Fehler. 
+ **SageMaker KI-Endpunktskalierung** — Stellen Sie sicher, dass der Referenzendpunkt des SageMaker KI-Modells für Athena-Aufrufe an den Endpunkt ausreichend hochskaliert ist. Weitere Informationen finden Sie unter [Automatisches Skalieren von SageMaker KI-Modellen](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling.html) im *Amazon SageMaker AI Developer Guide* und [CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html)in der *Amazon SageMaker AI API-Referenz*.
+ **IAM-Berechtigungen** — Um eine Abfrage auszuführen, die eine ML mit Athena-Funktion spezifiziert, muss der IAM-Prinzipal, der die Abfrage ausführt, berechtigt sein, die `sagemaker:InvokeEndpoint` Aktion für den Referenzendpunkt des SageMaker KI-Modells auszuführen. Weitere Informationen finden Sie unter [Zugriff für ML mit Athena zulassen](machine-learning-iam-access.md).
+ **ML-Athena-Funktionen dürfen in `GROUP BY`-Klauseln nicht direkt verwendet werden**

**Topics**
+ [Überlegungen und Einschränkungen](#considerations-and-limitations)
+ [ML mit Athena-Syntax verwenden](ml-syntax.md)
+ [Siehe Anwendungsbeispiele von Kunden](ml-videos.md)

# ML mit Athena-Syntax verwenden
<a name="ml-syntax"></a>

Die Klausel `USING EXTERNAL FUNCTION` gibt eine ML-Athena-Funktion oder mehrere Funktionen an, auf die durch eine nachfolgende `SELECT`-Anweisung in der Abfrage verwiesen werden kann. Sie definieren den Funktionsnamen, die Variablennamen und die Datentypen für die Variablen und Rückgabewerte.

## Syntax
<a name="ml-synopsis"></a>

Die folgende Syntax zeigt ein e`USING EXTERNAL FUNCTION`-Klausel, die eine ML-Athena-Funktion angibt.

```
USING EXTERNAL FUNCTION ml_function_name (variable1 data_type[, variable2 data_type][,...])
RETURNS data_type 
SAGEMAKER 'sagemaker_endpoint'
SELECT ml_function_name()
```

## Parameters
<a name="udf-parameters"></a>

**VERWENDUNG DER EXTERNEN FUNKTION *ml\$1function\$1name* (*variable1**data\$1type*[, *variable2**data\$1type*] [,...])**  
*ml\$1function\$1name*definiert den Funktionsnamen, der in nachfolgenden Abfrageklauseln verwendet werden kann. Jede *variable data\$1type* gibt eine benannte Variable und den entsprechenden Datentyp an, den das SageMaker KI-Modell als Eingabe akzeptiert. Der angegebene Datentyp muss ein unterstützter Athena-Datentyp sein.

**GIBT ZURÜCK *data\$1type***  
*data\$1type*gibt den SQL-Datentyp an, der als Ausgabe des SageMaker AI-Modells zur Abfrage *ml\$1function\$1name* zurückkehrt.

**SAGEMAKER '' *sagemaker\$1endpoint***  
*sagemaker\$1endpoint*gibt den Endpunkt des SageMaker KI-Modells an.

**WÄHLE [...] *ml\$1function\$1name*(*expression*) [...]**  
Die SELECT-Abfrage, die Werte an Funktionsvariablen und das SageMaker KI-Modell übergibt, um ein Ergebnis zurückzugeben. *ml\$1function\$1name*gibt die zuvor in der Abfrage definierte Funktion an, gefolgt von einer, *expression* die ausgewertet wird, um Werte zu übergeben. Die übergebenen und zurückgegebenen Werte müssen mit den Datentypen übereinstimmen, die in der Klausel `USING EXTERNAL FUNCTION` für die Funktion angegeben sind.

## Beispiel
<a name="ml-examples"></a>

Das folgende Beispiel zeigt eine Abfrage mittels ML mit Athena.

**Example**  

```
USING EXTERNAL FUNCTION predict_customer_registration(age INTEGER) 
    RETURNS DOUBLE
    SAGEMAKER 'xgboost-2019-09-20-04-49-29-303' 
SELECT predict_customer_registration(age) AS probability_of_enrolling, customer_id 
     FROM "sampledb"."ml_test_dataset" 
     WHERE predict_customer_registration(age) < 0.5;
```

# Siehe Anwendungsbeispiele von Kunden
<a name="ml-videos"></a>

Die folgenden Videos, die die Vorschauversion von Machine Learning (ML) mit Amazon Athena verwenden, zeigen, wie Sie SageMaker KI mit Athena verwenden können.

## Vorhersage der Kundenabwanderung
<a name="ml-videos-predict-churn"></a>

Das folgende Video zeigt, wie Athena mit den maschinellen Lernfunktionen von Amazon SageMaker AI kombiniert werden kann, um die Kundenabwanderung vorherzusagen.

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


## Erkennen von Bot-Netzen
<a name="ml-videos-detect-botnets"></a>

Das folgende Video zeigt, wie ein Unternehmen Amazon Athena und Amazon SageMaker AI verwendet, um Botnetze zu erkennen.

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


# Abfragen mit benutzerdefinierten Funktionen
<a name="querying-udf"></a>

Mit benutzerdefinierten Funktionen (UDF) in Amazon Athena können Sie eigene Funktionen zum Verarbeiten von Datensätzen oder Datensatzgruppen erstellen. Eine UDF akzeptiert Parameter, führt Arbeit aus und gibt dann ein Ergebnis zurück.

Um eine UDF in Athena zu verwenden, schreiben Sie eine `USING EXTERNAL FUNCTION`-Klausel vor eine `SELECT`-Anweisung in einer SQL-Abfrage. Die `SELECT`-Anweisung verweist auf die UDF und definiert die Variablen, die beim Ausführen der Abfrage an die UDF übergeben werden. Die SQL-Abfrage ruft eine Lambda-Funktion unter Verwendung der Java-Laufzeit auf, wenn sie die UDF aufruft. UDFssind innerhalb der Lambda-Funktion als Methoden in einem Java-Bereitstellungspaket definiert. In demselben Java-Bereitstellungspaket UDFs können mehrere für eine Lambda-Funktion definiert werden. Sie geben auch den Namen der Lambda-Funktion in der `USING EXTERNAL FUNCTION`-Klausel an.

Sie haben zwei Möglichkeiten, eine Lambda-Funktion für UDFs Athena bereitzustellen. Sie können die Funktion direkt mit Lambda bereitstellen, oder Sie können die AWS Serverless Application Repository verwenden. Um nach vorhandenen Lambda-Funktionen für zu suchen UDFs, können Sie das öffentliche AWS Serverless Application Repository oder Ihr privates Repository durchsuchen und dann auf Lambda bereitstellen. Sie können auch Java-Quellcode erstellen oder ändern, ihn in eine JAR-Datei verpacken und mit Lambda oder dem AWS Serverless Application Repository bereitstellen. Beispiele für Java-Quellcode und -Pakete für den Einstieg finden Sie unter [Erstellen und Bereitstellen einer UDF mit Lambda](udf-creating-and-deploying.md). Weitere Informationen zu Lambda finden Sie im [AWS Lambda -Entwicklerhandbuch](https://docs.aws.amazon.com/lambda/latest/dg/). Weitere Informationen AWS Serverless Application Repository dazu finden Sie im [AWS Serverless Application Repository Entwicklerhandbuch](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/).

Ein Beispiel, das UDFs mit Athena zur Übersetzung und Analyse von Text verwendet wird, finden Sie im Blogartikel AWS Machine Learning [Translate and analyze text using SQL functions with Amazon Athena, Amazon Translate und Amazon Comprehend, oder](https://aws.amazon.com/blogs/machine-learning/translate-and-analyze-text-using-sql-functions-with-amazon-athena-amazon-translate-and-amazon-comprehend/) schauen Sie sich den an. [video](udf-videos.md#udf-videos-xlate)

*Ein Beispiel für die Verwendung UDFs zur Erweiterung von Geodatenabfragen in Amazon Athena finden Sie unter [Erweitern von Geodatenabfragen in Amazon Athena mit UDFs und AWS Lambda](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/) im AWS Big Data-Blog.*

**Topics**
+ [Videos über UDFs In Athena](udf-videos.md)
+ [Überlegungen und Einschränkungen](udf-considerations-limitations.md)
+ [Abfragen mit UDF-Abfragesyntax](udf-query-syntax.md)
+ [Erstellen und Bereitstellen einer UDF mit Lambda](udf-creating-and-deploying.md)

# Videos über UDFs In Athena
<a name="udf-videos"></a>

Sehen Sie sich die folgenden Videos an, um mehr über die Verwendung UDFs in Athena zu erfahren.

**Video: Einführung von benutzerdefinierten Funktionen (UDFs) in Amazon Athena**  
Das folgende Video zeigt, wie Sie UDFs in Amazon Athena vertrauliche Informationen redigieren können.

**Anmerkung**  
Die Syntax in diesem Video ist Vorabversion, aber die Konzepte sind die gleichen. Verwenden Sie Athena ohne die `AmazonAthenaPreviewFunctionality`-Arbeitsgruppe. 

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


**Video: Übersetzen, analysieren und redigieren Sie Textfelder mithilfe von SQL-Abfragen in Amazon Athena**  
Das folgende Video zeigt, wie Sie UDFs in Amazon Athena zusammen mit anderen verwenden können, um Text AWS-Services zu übersetzen und zu analysieren.

**Anmerkung**  
Die Syntax in diesem Video ist Vorabversion, aber die Konzepte sind die gleichen. Die korrekte Syntax finden Sie im zugehörigen Blogbeitrag [Übersetzen, redigieren und analysieren Sie Text mithilfe von SQL-Funktionen mit Amazon Athena, Amazon Translate und Amazon Comprehend](https://aws.amazon.com/blogs/machine-learning/translate-and-analyze-text-using-sql-functions-with-amazon-athena-amazon-translate-and-amazon-comprehend/) im *AWS -Machine-Learning-Blog*.

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


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

Beachten Sie die folgenden Punkte, wenn Sie die benutzerdefinierte Funktion (UDFs) in Athena verwenden.
+ **Integrierte Athena Funktionen** – Integrierte Funktionen in Athena sind so konzipiert, dass sie sehr leistungsfähig sind. Wir empfehlen, UDFs wenn möglich die integrierten Funktionen zu verwenden. Weitere Hinweise zu integrierten Funktionen finden Sie unter [Funktionen in Amazon Athena](functions.md).
+ ** UDFs Nur Skalar** — Athena unterstützt nur Skalare UDFs, die jeweils eine Zeile verarbeiten und einen einzelnen Spaltenwert zurückgeben. Athena übergibt einen Batch von Zeilen, möglicherweise parallel, an die UDF, wenn Lambda aufgerufen wird. Beachten Sie beim Entwerfen UDFs und Abfragen die möglichen Auswirkungen dieser Verarbeitung auf den Netzwerkverkehr.
+ **UDF-Handler-Funktionen verwenden ein abgekürztes Format** — Verwenden Sie das abgekürzte Format (kein Vollformat) für Ihre UDF-Funktionen (z. B. `package.Class` anstelle von`package.Class::method`). 
+ **UDF-Methoden müssen in Kleinbuchstaben sein** — UDF-Methoden müssen in Kleinbuchstaben vorliegen; Kamelschreibung ist nicht zulässig. 
+ **UDF-Methoden benötigen Parameter** – UDF-Methoden müssen mindestens einen Eingabeparameter haben. Der Versuch, eine ohne Eingabeparameter definierte UDF aufzurufen, führt zu einer Laufzeitausnahme. UDFs sind dazu gedacht, Funktionen für Datensätze auszuführen, aber eine UDF ohne Argumente nimmt keine Daten auf, sodass eine Ausnahme auftritt.
+ **Java-Laufzeitunterstützung** — Derzeit unterstützt Athena UDFs die Java 8-, Java 11- und Java 17-Laufzeiten für Lambda. Weitere Informationen finden Sie unter [entwickeln von Lambda-Funktionen mit Java](https://docs.aws.amazon.com/lambda/latest/dg/lambda-java.html) im *AWS Lambda -Entwicklerhandbuch*.
**Anmerkung**  
 Für Java 17 müssen Sie den Wert der `JAVA_TOOL_OPTIONS`-Umgebungsvariable wie `--add-opens=java.base/java.nio=ALL-UNNAMED` in Ihrem Lambda festlegen. 
+ **IAM-Berechtigungen** – Um UDF-Abfrageanweisungen in Athena auszuführen und zu erstellen, muss der IAM-Prinzipal, der die Abfrage ausführt, zusätzlich zu den Athena-Funktionen auch Aktionen ausführen dürfen. Weitere Informationen finden Sie unter [Zugriff auf Athena zulassen UDFs: Beispielrichtlinien](udf-iam-access.md).
+ **Lambda-Kontingente** — Lambda-Kontingente gelten für. UDFs Weitere Informationen finden Sie unter [Lambda quotas (Lambda-Kontingente)](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) im *AWS Lambda -Entwicklerhandbuch.*
+ **Filterung auf Zeilenebene — Die Filterung auf** Zeilenebene von Lake Formation wird nicht unterstützt. UDFs 
+ **Ansichten** — Sie können Ansichten nicht mit verwenden. UDFs 
+ **Bekannte Probleme** — Eine vollständige up-to-date Liste der bekannten Probleme finden Sie unter [Einschränkungen und Probleme im Abschnitt](https://github.com/awslabs/aws-athena-query-federation/wiki/Limitations_And_Issues) awslabs/ aws-athena-query-federation von. GitHub

# Abfragen mit UDF-Abfragesyntax
<a name="udf-query-syntax"></a>

Die `USING EXTERNAL FUNCTION` Klausel gibt eine oder mehrere UDFs an, auf UDFs die in einer nachfolgenden `SELECT` Anweisung in der Abfrage verwiesen werden kann. Sie benötigen den Methodennamen für die UDF und den Namen der Lambda-Funktion, die die UDF hostet. Anstelle des Lambda-Funktionsnamens können Sie den Lambda-ARN verwenden. In kontenübergreifenden Szenarien ist der Lambda-ARN erforderlich.

## Syntax
<a name="udf-synopsis"></a>

```
USING EXTERNAL FUNCTION UDF_name(variable1 data_type[, variable2 data_type][,...])
RETURNS data_type
LAMBDA 'lambda_function_name_or_ARN'
[, EXTERNAL FUNCTION UDF_name2(variable1 data_type[, variable2 data_type][,...]) 
RETURNS data_type 
LAMBDA 'lambda_function_name_or_ARN'[,...]]
SELECT  [...] UDF_name(expression) [, UDF_name2(expression)] [...]
```

## Parameters
<a name="udf-parameters"></a>

**VERWENDUNG DER EXTERNEN FUNKTION *UDF\$1name* (*variable1**data\$1type*[, *variable2**data\$1type*] [,...])**  
*UDF\$1name*gibt den Namen der UDF an, der einer Java-Methode innerhalb der referenzierten Lambda-Funktion entsprechen muss. Jede *variable data\$1type* gibt eine benannte Variable und den entsprechenden Datentyp an, den die UDF als Eingabe akzeptiert. Der *data\$1type* muss einer der unterstützten Athena-Datentypen sein, die in der folgenden Tabelle aufgeführt sind und dem entsprechenden Java-Datentyp zugeordnet sein.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/udf-query-syntax.html)

**RÜCKSENDUNGEN *data\$1type***  
`data_type` gibt den SQL-Datentyp an, den die UDF als Ausgabe zurückgibt. Athena Datentypen, die in der obigen Tabelle aufgeführt sind, werden unterstützt. Verwenden Sie für den `DECIMAL` Datentyp die Syntax, `RETURNS DECIMAL(precision, scale)` wobei *precision* und Ganzzahlen *scale* sind.

**LAMBDA '' *lambda\$1function***  
*lambda\$1function*gibt den Namen der Lambda-Funktion an, die beim Ausführen der UDF aufgerufen werden soll.

**WÄHLEN SIE [...] *UDF\$1name*(*expression*) [...]**  
Die `SELECT` Abfrage, die Werte an die UDF übergibt und ein Ergebnis zurückgibt. *UDF\$1name*gibt die zu verwendende UDF an, gefolgt von einer, *expression* die ausgewertet wird, um Werte zu übergeben. Werte, die übergeben und zurückgegeben werden, müssen mit den entsprechenden Datentypen übereinstimmen, die für die UDF in der `USING EXTERNAL FUNCTION`-Klausel angegeben sind.

### Beispiele
<a name="udf-examples"></a>

Beispiele für Abfragen, die auf dem [UDFHandlerAthena-.java-Code](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/src/main/java/com/amazonaws/athena/connectors/udfs/AthenaUDFHandler.java) basieren GitHub, finden Sie auf der GitHub [Amazon Athena UDF-Connector-Seite](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-udfs). 

# Erstellen und Bereitstellen einer UDF mit Lambda
<a name="udf-creating-and-deploying"></a>

Um eine eigene UDF zu erstellen, erstellen Sie eine neue Java-Klasse, indem Sie die `UserDefinedFunctionHandler`-Klasse erweitern. Der Quellcode für die Datei [UserDefinedFunctionHandler.java](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/UserDefinedFunctionHandler.java) im SDK ist im [Repository awslabs/aws-athena-query-federation/athena](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk) -federation-sdk verfügbar GitHub , zusammen mit [Beispiel-UDF-Implementierungen](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-udfs), die Sie untersuchen und ändern können, um eine benutzerdefinierte UDF zu erstellen.

Die Schritte in diesem Abschnitt veranschaulichen das Schreiben und Erstellen einer benutzerdefinierten UDF-JAR-Datei mit [Apache Maven](https://maven.apache.org/index.html) über die Befehlszeile und eine Bereitstellung.

Führen Sie die folgenden Schritte aus, um mit Maven eine benutzerdefinierte UDF für Athena zu erstellen

1. [Klonen des SDK und Vorbereitung der Entwicklungsumgebung](#udf-create-install-sdk-prep-environment)

1. [Erstellen Ihres Maven-Projekts](#create-maven-project)

1. [Hinzufügen von Abhängigkeiten und Plugins zu Ihrem Maven-Projekt](#udf-add-maven-dependencies)

1. [Schreiben Sie Java-Code für UDFs](#udf-write-java)

1. [Erstellen der JAR-Datei](#udf-create-package-jar)

1. [Stellen Sie das JAR bereit für AWS Lambda](#udf-create-deploy)

## Klonen des SDK und Vorbereitung der Entwicklungsumgebung
<a name="udf-create-install-sdk-prep-environment"></a>

Bevor Sie beginnen, stellen Sie mithilfe von `sudo yum install git -y` sicher, dass git auf Ihrem System installiert ist.

**AWS Um das Query Federation SDK zu installieren**
+ Geben Sie Folgendes in der Befehlszeile ein, um das SDK-Repository zu klonen. Dieses Repository enthält den SDK, Beispiele und eine Suite von Datenquellen-Connectors. Weitere Hinweise zu Datenquellen-Connectors finden Sie unter [Nutzung von Amazon-Athena-Verbundabfrage](federated-queries.md).

  ```
  git clone https://github.com/awslabs/aws-athena-query-federation.git
  ```

**So installieren Sie die Voraussetzungen für dieses Verfahren:**

Wenn Sie auf einem Entwicklungscomputer arbeiten, auf dem Apache Maven AWS CLI, The und das AWS Serverless Application Model Build-Tool bereits installiert sind, können Sie diesen Schritt überspringen.

1. Führen Sie im `aws-athena-query-federation`-Stammverzeichnis des Verzeichnisses, das Sie beim Klonen erstellt haben, das Skript [prepare\$1dev\$1env.sh](https://github.com/awslabs/aws-athena-query-federation/blob/master/tools/prepare_dev_env.sh) aus, das die Entwicklungsumgebung vorbereitet.

1. Aktualisieren Sie die Shell, um neue Variablen zu erzeugen, die durch den Installationsprozess erstellt wurden, oder starten Sie die Terminalsitzung neu.

   ```
   source ~/.profile
   ```
**Wichtig**  
Wenn Sie diesen Schritt überspringen, erhalten Sie später eine Fehlermeldung, dass das AWS CLI oder AWS SAM Build-Tool Ihre Lambda-Funktion nicht veröffentlichen kann.

## Erstellen Ihres Maven-Projekts
<a name="create-maven-project"></a>

Führen Sie den folgenden Befehl aus, um Ihr Maven-Projekt zu erstellen. *groupId*Ersetzen Sie es durch die eindeutige ID Ihrer Organisation und *my-athena-udf* ersetzen Sie es durch den Namen Ihrer Anwendung. Weitere Informationen finden Sie unter [Wie erstelle ich mein erstes Maven-Projekt](https://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project)? in der Apache Maven-Dokumentation.

```
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=groupId \
-DartifactId=my-athena-udfs
```

## Hinzufügen von Abhängigkeiten und Plugins zu Ihrem Maven-Projekt
<a name="udf-add-maven-dependencies"></a>

Fügen Sie die folgenden Konfigurationen zu Ihrer Maven-`pom.xml`-Projektdatei hinzu. Ein Beispiel finden Sie in GitHub der Datei [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/pom.xml) unter.

```
<properties>
    <aws-athena-federation-sdk.version>2022.47.1</aws-athena-federation-sdk.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-athena-federation-sdk</artifactId>
        <version>${aws-athena-federation-sdk.version}</version>
    </dependency>
</dependencies>
    
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
```

## Schreiben Sie Java-Code für UDFs
<a name="udf-write-java"></a>

Erstellen Sie eine neue Klasse, indem Sie [UserDefinedFunctionHandler.java erweitern.](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/UserDefinedFunctionHandler.java) Schreiben Sie Ihr UDFs Inneres in die Klasse.

Im folgenden Beispiel werden zwei Java-Methoden für UDFs, `compress()` und`decompress()`, innerhalb der Klasse erstellt`MyUserDefinedFunctions`.

```
*package *com.mycompany.athena.udfs;

public class MyUserDefinedFunctions
        extends UserDefinedFunctionHandler
{
    private static final String SOURCE_TYPE = "MyCompany";

    public MyUserDefinedFunctions()
    {
        super(SOURCE_TYPE);
    }

    /**
     * Compresses a valid UTF-8 String using the zlib compression library.
     * Encodes bytes with Base64 encoding scheme.
     *
     * @param input the String to be compressed
     * @return the compressed String
     */
    public String compress(String input)
    {
        byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);

        // create compressor
        Deflater compressor = new Deflater();
        compressor.setInput(inputBytes);
        compressor.finish();

        // compress bytes to output stream
        byte[] buffer = new byte[4096];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
        while (!compressor.finished()) {
            int bytes = compressor.deflate(buffer);
            byteArrayOutputStream.write(buffer, 0, bytes);
        }

        try {
            byteArrayOutputStream.close();
        }
        catch (IOException e) {
            throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
        }

        // return encoded string
        byte[] compressedBytes = byteArrayOutputStream.toByteArray();
        return Base64.getEncoder().encodeToString(compressedBytes);
    }

    /**
     * Decompresses a valid String that has been compressed using the zlib compression library.
     * Decodes bytes with Base64 decoding scheme.
     *
     * @param input the String to be decompressed
     * @return the decompressed String
     */
    public String decompress(String input)
    {
        byte[] inputBytes = Base64.getDecoder().decode((input));

        // create decompressor
        Inflater decompressor = new Inflater();
        decompressor.setInput(inputBytes, 0, inputBytes.length);

        // decompress bytes to output stream
        byte[] buffer = new byte[4096];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
        try {
            while (!decompressor.finished()) {
                int bytes = decompressor.inflate(buffer);
                if (bytes == 0 && decompressor.needsInput()) {
                    throw new DataFormatException("Input is truncated");
                }
                byteArrayOutputStream.write(buffer, 0, bytes);
            }
        }
        catch (DataFormatException e) {
            throw new RuntimeException("Failed to decompress string", e);
        }

        try {
            byteArrayOutputStream.close();
        }
        catch (IOException e) {
            throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
        }

        // return decoded string
        byte[] decompressedBytes = byteArrayOutputStream.toByteArray();
        return new String(decompressedBytes, StandardCharsets.UTF_8);
    }
}
```

## Erstellen der JAR-Datei
<a name="udf-create-package-jar"></a>

Führen Sie `mvn clean install` aus um Ihr Projekt zu erstellen. Nach erfolgreicher Erstellung wird eine JAR-Datei in dem `target` Ordner Ihres Projekts mit dem Namen erstellt. Dabei *artifactId* handelt es sich beispielsweise um den Namen`artifactId-version.jar`, den Sie im Maven-Projekt angegeben haben. `my-athena-udfs`

## Stellen Sie das JAR bereit für AWS Lambda
<a name="udf-create-deploy"></a>

Sie haben zwei Möglichkeiten, Ihren Code in Lambda bereitzustellen:
+ Bereitstellen mit AWS Serverless Application Repository (empfohlen)
+ Erstellen einer Lambda-Funktion aus der JAR-Datei

### Option 1: Bereitstellen auf dem AWS Serverless Application Repository
<a name="udf-create-deploy-sar"></a>

Wenn Sie Ihre JAR-Datei auf dem bereitstellen AWS Serverless Application Repository, erstellen Sie eine AWS SAM YAML-Vorlagendatei, die die Architektur Ihrer Anwendung darstellt. Anschließend geben Sie diese YAML-Datei und einen Amazon-S3-Bucket an, in den Artefakte für Ihre Anwendung hochgeladen und für AWS Serverless Application Repository verfügbar gemacht werden. Im folgenden Verfahren wird das Skript [publish.sh](https://github.com/awslabs/aws-athena-query-federation/blob/master/tools/publish.sh) verwendet, das sich im `athena-query-federation/tools`-Verzeichnis des Athena-Query-Federation-SDKs befindet, das Sie zuvor geklont haben.

Weitere Informationen und Anforderungen finden Sie unter [Veröffentlichen von Anwendungen](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-publishing-applications.html) im *AWS Serverless Application Repository Entwicklerhandbuch*, [AWS SAM Vorlagenkonzepte](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html) im *AWS Serverless Application Model Entwicklerhandbuch* und [Veröffentlichen serverloser Anwendungen mit der AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html).

Das folgende Beispiel veranschaulicht Parameter in einer YAML-Datei. Fügen Sie Ihrer YAML-Datei ähnliche Parameter hinzu und speichern Sie diese in Ihrem Projektverzeichnis. Ein vollständiges [Beispiel finden Sie unter athena-udf.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/athena-udfs.yaml). GitHub 

```
Transform: 'AWS::Serverless-2016-10-31'
Metadata:
  'AWS::ServerlessRepo::Application':
    Name: MyApplicationName
    Description: 'The description I write for my application'
    Author: 'Author Name'
    Labels:
      - athena-federation
    SemanticVersion: 1.0.0
Parameters:
  LambdaFunctionName:
    Description: 'The name of the Lambda function that will contain your UDFs.'
    Type: String
  LambdaTimeout:
    Description: 'Maximum Lambda invocation runtime in seconds. (min 1 - 900 max)'
    Default: 900
    Type: Number
  LambdaMemory:
    Description: 'Lambda memory in MB (min 128 - 3008 max).'
    Default: 3008
    Type: Number
Resources:
  ConnectorConfig:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: !Ref LambdaFunctionName
      Handler: "full.path.to.your.handler. For example, com.amazonaws.athena.connectors.udfs.MyUDFHandler"
      CodeUri: "Relative path to your JAR file. For example, ./target/athena-udfs-1.0.jar"
      Description: "My description of the UDFs that this Lambda function enables."
      Runtime: java8
      Timeout: !Ref LambdaTimeout
      MemorySize: !Ref LambdaMemory
```

Kopieren Sie das `publish.sh`-Skript in das Projektverzeichnis, in dem Sie Ihre YAML-Datei gespeichert haben, und führen Sie den folgenden Befehl aus:

```
./publish.sh MyS3Location MyYamlFile
```

Zum Beispiel, wenn Ihr Bucket-Speicherort `s3://amzn-s3-demo-bucket/mysarapps/athenaudf` ist und Ihre YAML-Datei unter `my-athena-udfs.yaml` gespeichert wurde:

```
./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
```

**So erstellen Sie eine Lambda-Funktion**

1. Öffnen Sie die Lambda-Konsole unter [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/), wählen Sie **Create function** und dann **Browse Serverless App Repository**

1. Wählen Sie **Private applications (Private Anwendungen)** aus, suchen Sie Ihre Anwendung in der Liste oder mit Schlüsselwörtern und wählen Sie sie aus.

1. Überprüfen und geben Sie Anwendungsdetails an, und wählen Sie dann **Deploy (Bereitstellen)**.

   Sie können jetzt die in Ihrer JAR-Datei der Lambda-Funktion definierten Methodennamen wie UDFs in Athena verwenden.

### Option 2: Direktes Erstellen einer Lambda-Funktion
<a name="udf-create-deploy-lambda"></a>

Sie können eine Lambda-Funktion auch direkt über die Konsole oder AWS CLI erstellen. Das folgende Beispiel veranschaulicht die Verwendung des Lambda-CLI-Befehls `create-function`. 

```
aws lambda create-function \
 --function-name MyLambdaFunctionName \
 --runtime java8 \
 --role arn:aws:iam::1234567890123:role/my_lambda_role \
 --handler com.mycompany.athena.udfs.MyUserDefinedFunctions \
 --timeout 900 \
 --zip-file fileb://./target/my-athena-udfs-1.0-SNAPSHOT.jar
```

# Abfragen über Regionen hinweg
<a name="querying-across-regions"></a>

Athena unterstützt die Möglichkeit, Amazon S3 S3-Daten in einer AWS-Region anderen Region als der Region abzufragen, in der Sie Athena verwenden. Das Abfragen über Regionen hinweg kann eine Option sein, wenn das Verschieben der Daten nicht praktikabel oder zulässig ist oder wenn Sie Daten über mehrere Regionen hinweg abfragen möchten. Selbst wenn Athena in einer bestimmten Region nicht verfügbar ist, können Daten aus dieser Region aus einer anderen Region abgefragt werden, in der Athena verfügbar ist.

Um Daten in einer Region abzufragen, muss Ihr Konto in dieser Region aktiviert sein, auch wenn die Amazon-S3-Daten nicht zu Ihrem Konto gehören. Für einige Regionen wie USA Ost (Ohio) wird Ihr Zugriff auf die Region automatisch aktiviert, wenn Ihr Konto erstellt wird. Andere Regionen erfordern, dass Ihr Konto für die Region „angemeldet“ ist, bevor Sie es verwenden können. Eine Liste der Regionen, für die eine Anmeldung erforderlich ist, finden Sie unter [Verfügbare Regionen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) im *Amazon-EC2-Benutzerhandbuch*. Spezifische Anweisungen zur Registrierung für eine Region finden Sie unter [Verwaltung von AWS](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html) Regionen in der. *Allgemeine Amazon Web Services-Referenz*

## Überlegungen und Einschränkungen
<a name="querying-across-regions-considerations-and-limitations"></a>
+ **Datenzugriffs-Berechtigungen** – Um Amazon-S3-Daten von Athena über Regionen hinweg erfolgreich abzufragen, muss Ihr Konto über Berechtigungen zum Lesen der Daten verfügen. Wenn die Daten, die Sie abfragen möchten, zu einem anderen Konto gehören, muss Ihnen das andere Konto Zugriff auf den Amazon-S3-Standort gewähren, der die Daten enthält.
+ **Gebühren für die Datenübertragung** – Für regionsübergreifende Anfragen können Datenübertragungs-Gebühren für Amazon S3 anfallen. Das Ausführen einer Abfrage kann dazu führen, dass mehr Daten übertragen werden als die Größe des Datensatzes. Wir empfehlen Ihnen, Ihre Abfragen zunächst an einer Teilmenge von Daten zu testen und die Kosten in [AWS Cost Explorer](https://aws.amazon.com/aws-cost-management/aws-cost-explorer/) zu überprüfen.
+ **AWS Glue**— Sie können es AWS Glue regionsübergreifend verwenden. Für den regionsübergreifenden AWS Glue Verkehr können zusätzliche Gebühren anfallen. Weitere Informationen finden Sie im *AWS Big* [Data-Blog unter Erstellen von konto- und regionsübergreifenden AWS Glue Verbindungen](https://aws.amazon.com/blogs/big-data/create-cross-account-and-cross-region-aws-glue-connections/).
+ **Amazon-S3-Verschlüsselungsoptionen** – Die SSE-S3- und SSE-KMS-Verschlüsselungsoptionen werden für Abfragen über Regionen hinweg unterstützt; CSE-KMS nicht. Weitere Informationen finden Sie unter [Unterstützte Verschlüsselungsoptionen der Amazon S3](encryption.md#encryption-options-S3-and-Athena).
+ **Verbundabfragen** — Die übergreifende AWS-Regionen Verwendung von Verbundabfragen wird nicht unterstützt. 

Sofern die oben genannten Bedingungen erfüllt sind, können Sie eine Athena-Tabelle erstellen, die auf den von Ihnen angegebenen `LOCATION`-Wert verweist, und die Daten transparent abfragen. Es ist keine spezielle Syntax erforderlich. Weitere Informationen zum Erstellen von Athena-Tabellen finden Sie unter [Erstellen von Tabellen in Athena](creating-tables.md).

# Fragen Sie die ab AWS Glue Data Catalog
<a name="querying-glue-catalog"></a>

Da AWS Glue Data Catalog es von vielen AWS-Services als zentrales Metadaten-Repository verwendet wird, möchten Sie möglicherweise die Metadaten des Datenkatalogs abfragen. Dazu können Sie SQL-Abfragen in Athena verwenden. Sie können Athena verwenden, um AWS Glue Katalogmetadaten wie Datenbanken, Tabellen, Partitionen und Spalten abzufragen.

Um AWS Glue Katalog-Metadaten zu erhalten, fragen Sie die `information_schema` Datenbank im Athena-Backend ab. In den Beispielabfragen in diesem Thema wird gezeigt, wie Sie Athena verwenden, um AWS Glue -Katalog-Metadaten für häufige Anwendungsfälle abzufragen.

## Überlegungen und Einschränkungen
<a name="querying-glue-catalog-considerations-limitations"></a>
+ Anstatt die `information_schema`-Datenbank abzufragen, ist es möglich, einzelne Apache-Hive-[DDL-Befehle](ddl-reference.md) zu verwenden, um Metadateninformationen für bestimmte Datenbanken, Tabellen, Ansichten, Partitionen und Spalten aus Athena zu extrahieren. Die Ausgabe erfolgt jedoch in einem nicht tabellarischen Format.
+ Abfragen `information_schema` sind am leistungsfähigsten, wenn Sie nur über eine geringe bis mäßige Menge an Metadaten verfügen. AWS Glue Wenn Sie eine große Menge an Metadaten haben, können Fehler auftreten.
+ Sie können mit `CREATE VIEW` keine Ansicht in der `information_schema`-Datenbank erstellen. 

**Topics**
+ [Überlegungen und Einschränkungen](#querying-glue-catalog-considerations-limitations)
+ [Auflisten von Datenbanken und Durchsuchen einer angegebenen Datenbank](querying-glue-catalog-querying-available-databases-including-rdbms.md)
+ [Auflisten von Tabellen in einer angegebenen Datenbank und Suche nach einer Tabelle anhand des Namens](querying-glue-catalog-listing-tables.md)
+ [Auflisten von Partitionen für eine bestimmte Tabelle](querying-glue-catalog-listing-partitions.md)
+ [Auflisten oder Durchsuchen von Spalten für eine angegebene Tabelle oder Ansicht](querying-glue-catalog-listing-columns.md)
+ [Auflistung der Spalten, die bestimmte Tabellen gemeinsam haben](querying-glue-catalog-listing-columns-in-common.md)
+ [Auflisten aller Spalten für alle Tabellen](querying-glue-catalog-listing-all-columns-for-all-tables.md)

# Auflisten von Datenbanken und Durchsuchen einer angegebenen Datenbank
<a name="querying-glue-catalog-querying-available-databases-including-rdbms"></a>

Die Beispiele in diesem Abschnitt zeigen, wie die Datenbanken in Metadaten nach Schema-Namen aufgelistet werden.

**Example – Auflisten von Datenbanken**  
Über die folgende Beispielabfrage werden die Datenbanken aus der `information_schema.schemata` Tabelle aufgelistet.  

```
SELECT schema_name
FROM   information_schema.schemata
LIMIT  10;
```
In der folgenden Tabelle werden Beispielergebnisse angezeigt.  


****  

|  |  | 
| --- |--- |
| 6 | alb-databas1 | 
| 7 | alb\$1original\$1cust | 
| 8 | alblogsdatabase | 
| 9 | athena\$1db\$1test | 
| 10 | athena\$1ddl\$1db | 

**Example – Durchsuchen einer angegebenen Datenbank**  
In der folgenden Beispielabfrage ist `rdspostgresql` eine Beispieldatenbank.  

```
SELECT schema_name
FROM   information_schema.schemata
WHERE  schema_name = 'rdspostgresql'
```
In der folgenden Tabelle werden Beispielergebnisse angezeigt.  


****  

|  | schema\$1name | 
| --- | --- | 
| 1 | rdspostgresql | 

# Auflisten von Tabellen in einer angegebenen Datenbank und Suche nach einer Tabelle anhand des Namens
<a name="querying-glue-catalog-listing-tables"></a>

Um Metadaten für Tabellen aufzulisten, kann die Abfrage anhand des Tabellenschemas oder Tabellennamens erfolgen.

**Example – Auflisten von Tabellen nach Schema**  
Über die folgende Abfrage werden Tabellen aufgelistet, die das `rdspostgresql`-Tabellenschema verwenden.  

```
SELECT table_schema,
       table_name,
       table_type
FROM   information_schema.tables
WHERE  table_schema = 'rdspostgresql'
```
In der folgenden Tabelle wird ein Beispielergebnis gezeigt.  


****  

|  | table\$1schema | table\$1name | table\$1type | 
| --- | --- | --- | --- | 
| 1 | rdspostgresql | rdspostgresqldb1\$1public\$1account | BASE TABLE | 

**Example – Suche nach einer Tabelle anhand des Namens**  
Über die folgende Abfrage werden Metadaten-Informationen für die Tabelle `athena1` abgerufen.  

```
SELECT table_schema,
       table_name,
       table_type
FROM   information_schema.tables
WHERE  table_name = 'athena1'
```
In der folgenden Tabelle wird ein Beispielergebnis gezeigt.  


****  

|  | table\$1schema | table\$1name | table\$1type | 
| --- | --- | --- | --- | 
| 1 | Standard | athena1 | BASE TABLE | 

# Auflisten von Partitionen für eine bestimmte Tabelle
<a name="querying-glue-catalog-listing-partitions"></a>

Sie können `SHOW PARTITIONS table_name` verwenden, um die Partitionen für eine angegebene Tabelle aufzulisten, wie im folgenden Beispiel.

```
SHOW PARTITIONS cloudtrail_logs_test2
```

Sie können auch eine `$partitions`-Metadatenabfrage verwenden, um die Partitionsnummern und -werte für eine bestimmte Tabelle aufzulisten.

**Example – Abfragen der Partitionen für eine Tabelle mit der \$1partitions-Syntax**  
Über die folgende Beispielabfrage werden die Partitionen für die Tabelle `cloudtrail_logs_test2` mit der Syntax `$partitions` aufgelistet.  

```
SELECT * FROM default."cloudtrail_logs_test2$partitions" ORDER BY partition_number
```
In der folgenden Tabelle werden Beispielergebnisse angezeigt.  


****  

|  | table\$1catalog | table\$1schema | table\$1name | Jahr | Monat | Tag | 
| --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | Standard | cloudtrail\$1logs\$1test2 | 2020 | 08 | 10 | 
| 2 | awsdatacatalog | Standard | cloudtrail\$1logs\$1test2 | 2020 | 08 | 11 | 
| 3 | awsdatacatalog | Standard | cloudtrail\$1logs\$1test2 | 2020 | 08 | 12 | 

# Auflisten oder Durchsuchen von Spalten für eine angegebene Tabelle oder Ansicht
<a name="querying-glue-catalog-listing-columns"></a>

Sie können alle Spalten für eine Tabelle und alle Spalten für eine Ansicht auflisten oder anhand des Namens nach einer Spalte in einer angegebenen Datenbank und Tabelle suchen.

Um die Spalten aufzulisten, verwenden Sie eine `SELECT *`-Abfrage. Geben Sie in der `FROM`-Klausel `information_schema.columns` an. Verwenden Sie in der `WHERE`-Klausel `table_schema='database_name'`, um die Datenbank anzugeben und `table_name = 'table_name'`, um die Tabelle oder Ansicht anzugeben, die die aufzulistenden Spalten enthält.

**Example – Auflisten aller Spalten für eine angegebene Tabelle**  
Über die folgende Beispielabfrage werden alle Spalten für die Tabelle auf `rdspostgresqldb1_public_account` aufgelistet.  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'rdspostgresql'
       AND table_name = 'rdspostgresqldb1_public_account'
```
In der folgenden Tabelle werden Beispielergebnisse angezeigt.  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | Kommentar | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | password | 1 |  | JA | varchar |  |  | 
| 2 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | user\$1id | 2 |  | JA | Ganzzahl |  |  | 
| 3 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | created\$1on | 3 |  | JA | Zeitstempel |  |  | 
| 4 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | last\$1login | 4 |  | JA | Zeitstempel |  |  | 
| 5 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | email | 5 |  | JA | varchar |  |  | 
| 6 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | username | 6 |  | JA | varchar |  |  | 

**Example – Auflisten der Spalten für eine angegebene Ansicht**  
Über die folgende Beispielabfrage werden alle Spalten in der `default`-Datenbank für die Ansicht auf `arrayview` aufgelistet.  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'default'
       AND table_name = 'arrayview'
```
In der folgenden Tabelle werden Beispielergebnisse angezeigt.  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | Kommentar | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | Standard | arrayview | searchdate | 1 |  | JA | varchar |  |  | 
| 2 | awsdatacatalog | Standard | arrayview | sid | 2 |  | JA | varchar |  |  | 
| 3 | awsdatacatalog | Standard | arrayview | btid | 3 |  | JA | varchar |  |  | 
| 4 | awsdatacatalog | Standard | arrayview | p | 4 |  | JA | varchar |  |  | 
| 5 | awsdatacatalog | Standard | arrayview | infantprice | 5 |  | JA | varchar |  |  | 
| 6 | awsdatacatalog | Standard | arrayview | sump | 6 |  | JA | varchar |  |  | 
| 7 | awsdatacatalog | Standard | arrayview | journeymaparray | 7 |  | JA | array(varchar) |  |  | 

**Example – Suche nach einer Spalte anhand des Namens in einer angegebenen Datenbank und Tabelle**  
Über die folgende Beispielabfrage wird nach Metadaten für die `sid`-Spalte in der `arrayview`-Ansicht der `default`-Datenbank gesucht.  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'default'
       AND table_name = 'arrayview' 
       AND column_name='sid'
```
In der folgenden Tabelle wird ein Beispielergebnis gezeigt.  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | Kommentar | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | Standard | arrayview | sid | 2 |  | JA | varchar |  |  | 

# Auflistung der Spalten, die bestimmte Tabellen gemeinsam haben
<a name="querying-glue-catalog-listing-columns-in-common"></a>

Sie können die Spalten auflisten, die bestimmte Tabellen in einer Datenbank gemeinsam haben.
+ Verwenden der Syntax `SELECT column_name FROM information_schema.columns`.
+ Verwenden Sie für die `WHERE`-Klausel die Syntax `WHERE table_name IN ('table1', 'table2')`.

**Example – Listet gemeinsame Spalten für zwei Tabellen in derselben Datenbank auf**  
Die folgende Beispielabfrage listet die Spalten auf, die die Tabellen `table1` und ich gemeinsam `table2` haben.  

```
SELECT column_name
FROM information_schema.columns
WHERE table_name IN ('table1', 'table2')
GROUP BY column_name
HAVING COUNT(*) > 1;
```

# Auflisten aller Spalten für alle Tabellen
<a name="querying-glue-catalog-listing-all-columns-for-all-tables"></a>

Sie können alle Spalten für alle Tabellen in `AwsDataCatalog` oder für alle Tabellen in einer bestimmten Datenbank in `AwsDataCatalog` auflisten.
+ Um alle Spalten für alle Datenbanken in `AwsDataCatalog` aufzulisten, verwenden Sie die Abfrage `SELECT * FROM information_schema.columns`.
+ Um die Ergebnisse auf eine bestimmte Datenbank zu beschränken, verwenden Sie `table_schema='database_name'` in der `WHERE`-Klausel.

**Example – Auflisten aller Spalten für alle Tabellen in einer bestimmten Datenbank**  
Über die folgende Beispielabfrage werden alle Spalten für alle Tabellen in der Datenbank `webdata` aufgelistet.  

```
SELECT * FROM information_schema.columns WHERE table_schema = 'webdata'            
```

# AWS-Service Logs abfragen
<a name="querying-aws-service-logs"></a>

Dieser Abschnitt enthält mehrere Verfahren für die Verwendung von Amazon Athena zur Abfrage beliebter Datensätze wie AWS CloudTrail Logs, Amazon-Logs, Classic Load Balancer CloudFront Balancer-Logs, Application Load Balancer Balancer-Logs, Amazon VPC-Flow-Logs und Network Load Balancer Balancer-Logs.

Für die Aufgaben in diesem Abschnitt wird die Athena-Konsole eingesetzt. Sie können jedoch auch andere Tools wie den [Athena-JDBC-Treiber](connect-with-jdbc.md), die [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/athena/), oder die [Amazon-Athena-API-Referenz](https://docs.aws.amazon.com/athena/latest/APIReference/) verwenden.

Informationen AWS CloudFormation zur automatischen Erstellung von AWS-Service Protokolltabellen, Partitionen und Beispielabfragen in Athena finden Sie unter [Automatisieren der AWS-Service Protokolltabellenerstellung und deren Abfrage mit Amazon Athena](https://aws.amazon.com/blogs/big-data/automating-aws-service-logs-table-creation-and-querying-them-with-amazon-athena/) im AWS Big Data-Blog. Informationen zur Verwendung einer Python-Bibliothek AWS Glue zur Erstellung eines gemeinsamen Frameworks für die Verarbeitung und Abfrage von AWS-Service Protokollen in Athena finden Sie unter [Einfache Abfrage von AWS-Service Protokollen mit Amazon](https://aws.amazon.com/blogs/big-data/easily-query-aws-service-logs-using-amazon-athena/) Athena.

Die Themen in diesem Abschnitt setzen voraus, dass Sie die entsprechenden Berechtigungen für den Zugriff auf Athena und den Amazon-S3-Bucket konfiguriert haben, in dem sich die abzufragenden Daten befinden sollten. Weitere Informationen erhalten Sie unter [Einrichtung, administrativer und programmatischer Zugriff](setting-up.md) und [Erste Schritte](getting-started.md).

**Topics**
+ [Application Load Balancer](application-load-balancer-logs.md)
+ [Elastic Load Balancing](elasticloadbalancer-classic-logs.md)
+ [CloudFront](cloudfront-logs.md)
+ [CloudTrail](cloudtrail-logs.md)
+ [Amazon EMR](emr-logs.md)
+ [Global Accelerator](querying-global-accelerator-flow-logs.md)
+ [GuardDuty](querying-guardduty.md)
+ [Network Firewall](querying-network-firewall-logs.md)
+ [Network Load Balancer](networkloadbalancer-classic-logs.md)
+ [Route 53](querying-r53-resolver-logs.md)
+ [Amazon SES](querying-ses-logs.md)
+ [Amazon VPC](vpc-flow-logs.md)
+ [AWS WAF](waf-logs.md)

# Abfragen von Protokollen für Application Load Balancer
<a name="application-load-balancer-logs"></a>

Ein Application Load Balancer ist eine Lastverteilungsoption für Elastic Load Balancing, die eine Verteilung des Datenverkehrs in einer Microservices-Bereitstellung mit Containern ermöglicht. Durch das Abfragen von Application Load Balancer-Protokollen können Sie die Datenverkehrsquelle, die Latenz und die Bytes anzeigen, die zwischen Elastic Load Balancing-Instances und Backend-Anwendungen übermittelt werden. Weitere Informationen finden Sie unter [Zugriffsprotokolle für Ihren Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html) und [Verbindungsprotokolle für Ihren Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html) im *Benutzerhandbuch für Application Load Balancer*.

## Voraussetzungen
<a name="application-load-balancer-logs-prerequisites"></a>
+ Aktivieren Sie die [Zugriffsprotokollierung](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html) oder [Verbindungsprotokollierung ](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html), damit Protokolle für Application Load Balancer in Ihrem Amazon-S3-Bucket gespeichert werden können.
+ Eine Datenbank, die die Tabelle enthält, die Sie für Athena erstellen werden. Um eine Datenbank zu erstellen, können Sie Athena oder die AWS Glue Konsole verwenden. Weitere Informationen finden Sie unter [Erstellen von Datenbanken in Athena](creating-databases.md) in diesem Leitfaden oder unter [Arbeiten mit Datenbanken in der AWS -Glue-Konsole](https://docs.aws.amazon.com/glue/latest/dg/console-databases.html) im *Entwicklerhandbuch für AWS Glue *. 

**Topics**
+ [Voraussetzungen](#application-load-balancer-logs-prerequisites)
+ [Erstellen der Tabelle für ALB-Zugriffsprotokolle](create-alb-access-logs-table.md)
+ [Erstellen der Tabelle für ALB-Zugriffsprotokolle in Athena mithilfe der Partitionsprojektion](create-alb-access-logs-table-partition-projection.md)
+ [Beispielabfragen für ALB-Zugriffsprotokolle](query-alb-access-logs-examples.md)
+ [Erstellen der Tabelle für ALB-Verbindungsprotokolle](create-alb-connection-logs-table.md)
+ [Erstellen der Tabelle für ALB-Verbindungsprotokolle in Athena mithilfe der Partitionsprojektion](create-alb-connection-logs-table-partition-projection.md)
+ [Beispielabfragen für ALB-Verbindungsprotokolle](query-alb-connection-logs-examples.md)
+ [Weitere Ressourcen](application-load-balancer-logs-additional-resources.md)

# Erstellen der Tabelle für ALB-Zugriffsprotokolle
<a name="create-alb-access-logs-table"></a>

1. Kopieren Sie die folgende `CREATE TABLE`-Anweisung, fügen Sie sie in den Abfrage-Editor der Athena-Konsole ein und ändern Sie sie dann nach Bedarf für Ihre eigenen Anforderungen an die Protokolleinträge. Weitere Informationen zu den ersten Schritten mit der Athena-Konsole finden Sie unter [Erste Schritte](getting-started.md). Ersetzen Sie den Pfad in der `LOCATION`-Klausel durch den Speicherort Ihres Amazon S3-Zugriffsprotokollordners. Weitere Informationen zum Speicherort der Zugriffsprotokolldatei finden Sie unter [Zugriffsprotokoll-Dateien](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format) im *Benutzerhandbuch für Application Load Balancer*.

   Informationen zu den einzelnen Protokolldateien-Feldern finden Sie unter [Zugriffsprotokoll-Einträge](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format) im *Benutzerhandbuch für Application Load Balancer*.
**Anmerkung**  
Die folgende `CREATE TABLE`-Beispielanweisung enthält die kürzlich hinzugefügten Spalten `classification`, `classification_reason` und `conn_trace_id` ('Verfolgungs-ID' oder TID). Um eine Tabelle für Application Load Balancer-Zugriffsprotokolle zu erstellen, die diese Einträge nicht enthalten, entfernen Sie die entsprechenden Spalten aus der `CREATE TABLE`-Anweisung und ändern Sie den regulären Ausdruck entsprechend. 

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
               type string,
               time string,
               elb string,
               client_ip string,
               client_port int,
               target_ip string,
               target_port int,
               request_processing_time double,
               target_processing_time double,
               response_processing_time double,
               elb_status_code int,
               target_status_code string,
               received_bytes bigint,
               sent_bytes bigint,
               request_verb string,
               request_url string,
               request_proto string,
               user_agent string,
               ssl_cipher string,
               ssl_protocol string,
               target_group_arn string,
               trace_id string,
               domain_name string,
               chosen_cert_arn string,
               matched_rule_priority string,
               request_creation_time string,
               actions_executed string,
               redirect_url string,
               lambda_error_reason string,
               target_port_list string,
               target_status_code_list string,
               classification string,
               classification_reason string,
               conn_trace_id string
               )
               ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
               WITH SERDEPROPERTIES (
               'serialization.format' = '1',
               'input.regex' = 
           '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
               )
               LOCATION 's3://amzn-s3-demo-bucket/access-log-folder-path/'
   ```
**Anmerkung**  
Wir empfehlen, das Muster *`?( .*)?`* am Ende des `input.regex`-Parameters immer beizubehalten, um künftige Protokolleinträge zu verarbeiten, falls neue ALB-Protokollfelder hinzugefügt werden. 

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `alb_access_logs`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

# Erstellen der Tabelle für ALB-Zugriffsprotokolle in Athena mithilfe der Partitionsprojektion
<a name="create-alb-access-logs-table-partition-projection"></a>

Da ALB-Zugriffsprotokolle über eine bekannte Struktur verfügen, deren Partitionsschema Sie im Voraus angeben können, können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung mithilfe der Athena-Partitionsprojektion-Feature automatisieren. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von `ALTER TABLE ADD PARTITION` hinzuzufügen. 

Die folgende `CREATE TABLE`-Beispielanweisung verwendet automatisch die Partitionsprojektion in ALB-Zugriffsprotokollen von einem angegebenen Datum bis zur Gegenwart für eine einzelne AWS -Region. Die Anweisung basiert auf dem Beispiel im vorherigen Abschnitt, fügt jedoch `PARTITIONED BY`- und `TBLPROPERTIES`-Klauseln hinzu, um die Partitionsprojektion zu ermöglichen. Ersetzen Sie in den `LOCATION`- und `storage.location.template`-Klauseln die Platzhalter durch Werte, die den Amazon-S3-Bucket-Speicherort Ihrer ALB-Zugriffsprotokolle angeben. Weitere Informationen zum Speicherort der Zugriffsprotokolldatei finden Sie unter [Zugriffsprotokoll-Dateien](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format) im *Benutzerhandbuch für Application Load Balancer*. Ersetzen Sie für `projection.day.range`*2022*/*01*/*01*durch das Startdatum, das Sie verwenden möchten. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen. Sie müssen `ALTER TABLE ADD PARTITION` nicht ausführen, um die Partitionen zu laden. Informationen zu den einzelnen Protokolldateifeldern finden Sie unter [Zugriffsprotokolleinträge](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format). 

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string,
            conn_trace_id string
            )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2022/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

Weitere Informationen zur Partitionsprojektion finden Sie unter [Partitionsprojektion mit Amazon Athena verwenden](partition-projection.md).

**Anmerkung**  
Wir empfehlen, das Muster *?( .\$1)?* am Ende des `input.regex`-Parameters immer beizubehalten, um künftige Protokolleinträge zu verarbeiten, falls neue ALB-Protokollfelder hinzugefügt werden. 

# Beispielabfragen für ALB-Zugriffsprotokolle
<a name="query-alb-access-logs-examples"></a>

Bei der folgenden Abfrage wird die Anzahl der HTTP GET-Anfragen gezählt und nach Client-IP-Adressen gruppiert, die vom Load Balancer empfangen wurden:

```
SELECT COUNT(request_verb) AS
 count,
 request_verb,
 client_ip
FROM alb_access_logs
GROUP BY request_verb, client_ip
LIMIT 100;
```

Eine weitere Abfrage zeigt die von Safari-Browserbenutzern URLs besuchten:

```
SELECT request_url
FROM alb_access_logs
WHERE user_agent LIKE '%Safari%'
LIMIT 10;
```

Die folgende Abfrage zeigt Datensätze mit ELB-Statuscodewerten größer oder gleich 500.

```
SELECT * FROM alb_access_logs
WHERE elb_status_code >= 500
```

Im folgenden Beispiel wird gezeigt, wie Sie die Protokolle nach `datetime` durchsuchen:

```
SELECT client_ip, sum(received_bytes) 
FROM alb_access_logs
WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
     BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') 
GROUP BY client_ip;
```

Die folgende Abfrage fragt die Tabelle ab, die die Partitionsprojektion für alle ALB-Zugriffsprotokolle vom angegebenen Tag verwendet.

```
SELECT * 
FROM alb_access_logs 
WHERE day = '2022/02/12'
```

# Erstellen der Tabelle für ALB-Verbindungsprotokolle
<a name="create-alb-connection-logs-table"></a>

1. Kopieren Sie die folgende `CREATE TABLE`-Beispielanweisung, fügen Sie sie in den Abfrage-Editor der Athena-Konsole ein und ändern Sie sie dann nach Bedarf für Ihre eigenen Anforderungen an die Protokolleinträge. Weitere Informationen zu den ersten Schritten mit der Athena-Konsole finden Sie unter [Erste Schritte](getting-started.md). Ersetzen Sie den Pfad in der `LOCATION`-Klausel durch den Speicherort Ihres Amazon S3-Verbindungsprotokollordners. Weitere Informationen zum Speicherort der Verbindungsprotokolldatei finden Sie unter [Verbindungsprotokolldateien](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format) im *Benutzerhandbuch für Application Load Balancers*. Informationen zu den einzelnen Protokolldateifeldern finden Sie unter [Verbindungsprotokolleinträge](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format). 

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
            time string,
            client_ip string,
            client_port int,
            listener_port int,
            tls_protocol string,
            tls_cipher string,
            tls_handshake_latency double,
            leaf_client_cert_subject string,
            leaf_client_cert_validity string,
            leaf_client_cert_serial_number string,
            tls_verify_status string,
            conn_trace_id string
            ) 
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/connection-log-folder-path/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `alb_connection_logs`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

# Erstellen der Tabelle für ALB-Verbindungsprotokolle in Athena mithilfe der Partitionsprojektion
<a name="create-alb-connection-logs-table-partition-projection"></a>

Da ALB-Verbindungsprotokolle über eine bekannte Struktur verfügen, deren Partitionsschema Sie im Voraus angeben können, können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung mithilfe der Athena-Partitionsprojektion-Feature automatisieren. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von `ALTER TABLE ADD PARTITION` hinzuzufügen. 

Die folgende `CREATE TABLE`-Beispielanweisung verwendet automatisch die Partitionsprojektion in ALB-Verbindungsprotokollen von einem angegebenen Datum bis zur Gegenwart für eine einzelne AWS -Region. Die Anweisung basiert auf dem Beispiel im vorherigen Abschnitt, fügt jedoch `PARTITIONED BY`- und `TBLPROPERTIES`-Klauseln hinzu, um die Partitionsprojektion zu ermöglichen. Ersetzen Sie in den `LOCATION`- und `storage.location.template`-Klauseln die Platzhalter durch Werte, die den Amazon-S3-Bucket-Speicherort Ihrer ALB-Verbindungsprotokolle angeben. Weitere Informationen zum Speicherort der Verbindungsprotokolldatei finden Sie unter [Verbindungsprotokolldateien](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format) im *Benutzerhandbuch für Application Load Balancers*. Ersetzen Sie für `projection.day.range`*2023*/*01*/*01*durch das Startdatum, das Sie verwenden möchten. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen. Sie müssen `ALTER TABLE ADD PARTITION` nicht ausführen, um die Partitionen zu laden. Informationen zu den einzelnen Protokolldateifeldern finden Sie unter [Verbindungsprotokolleinträge](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format).

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
         time string,
         client_ip string,
         client_port int,
         listener_port int,
         tls_protocol string,
         tls_cipher string,
         tls_handshake_latency double,
         leaf_client_cert_subject string,
         leaf_client_cert_validity string,
         leaf_client_cert_serial_number string,
         tls_verify_status string,
         conn_trace_id string
         )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2023/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

Weitere Informationen zur Partitionsprojektion finden Sie unter [Partitionsprojektion mit Amazon Athena verwenden](partition-projection.md).

# Beispielabfragen für ALB-Verbindungsprotokolle
<a name="query-alb-connection-logs-examples"></a>

Die folgende Abfrage zählt die Vorkommen, bei denen der Wert für `tls_verify_status` nicht `'Success'` war, gruppiert nach Client-IP-Adresse:

```
SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs
WHERE tls_verify_status != 'Success'
GROUP BY client_ip
ORDER BY count() DESC;
```

Die folgende Abfrage sucht nach Vorkommen, bei denen der Wert für `tls_handshake_latency` im angegebenen Zeitraum mehr als 2 Sekunden betrug:

```
SELECT * FROM alb_connection_logs
WHERE 
  (
    parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
    BETWEEN 
    parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
    AND 
    parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
  ) 
  AND 
    (tls_handshake_latency >= 2.0);
```

# Weitere Ressourcen
<a name="application-load-balancer-logs-additional-resources"></a>

Weitere Informationen zur Verwendung von ALB-Protokolle finden Sie in den folgenden Ressourcen.
+ [Wie analysiere ich meine Zugriffsprotokolle von Application Load Balancer mit Amazon Athena](https://repost.aws/knowledge-center/athena-analyze-access-logs) im *AWS Knowledge Center*.
+ Informationen zu den HTTP-Statuscodes in Elastic Load Balancing finden Sie unter [Fehlerbehebung bei Ihren Application Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html) im *Benutzerhandbuch für Application Load Balancer*.
+ [Katalogisieren und analysieren Sie Application Load Balancer Balancer-Protokolle effizienter mit AWS Glue benutzerdefinierten Klassifikatoren und Amazon Athena](https://aws.amazon.com/blogs/big-data/catalog-and-analyze-application-load-balancer-logs-more-efficiently-with-aws-glue-custom-classifiers-and-amazon-athena/) im *AWS Big* Data-Blog.

# Abfragen von Classic Load Balancer-Protokollen
<a name="elasticloadbalancer-classic-logs"></a>

Mithilfe von Classic-Load-Balancer-Protokollen können Sie Datenverkehrsmuster von und zu Elastic-Load-Balancing-Instances und Backend-Anwendungen analysieren und nachvollziehen. Dabei werden Ihnen die Datenverkehrsquelle, die Latenz und die übertragenen Bytes angezeigt.

Bevor Sie die Elastic-Load-Balancing-Protokolle analysieren, konfigurieren Sie sie für die Speicherung im Amazon-S3-Ziel-Bucket. Weitere Informationen finden Sie unter [Aktivieren der Zugriffsprotokolle für Ihren Classic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html).

**So erstellen Sie die Tabelle für Elastic-Load-Balancing-Protokolle**

1. Kopieren Sie die folgende DDL-Anweisung in die Athena-Konsole. Überprüfen Sie die [Syntax](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/access-log-collection.html#access-log-entry-format)der Elastic-Load-Balancing Protokolldatensätze. Möglicherweise müssen Sie die folgende Abfrage aktualisieren, so dass sie die Spalten und die Regex-Syntax für die neueste Version des Datensatzes enthält. 

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs (
    
    timestamp string,
    elb_name string,
    request_ip string,
    request_port int,
    backend_ip string,
    backend_port int,
    request_processing_time double,
    backend_processing_time double,
    client_response_time double,
    elb_response_code string,
    backend_response_code string,
    received_bytes bigint,
    sent_bytes bigint,
    request_verb string,
    url string,
    protocol string,
    user_agent string,
    ssl_cipher string,
    ssl_protocol string
   )
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
   WITH SERDEPROPERTIES (
    'serialization.format' = '1',
    'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (\"[^\"]*\") ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$'
   )
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_account_ID/elasticloadbalancing/';
   ```

1. Ändern Sie den `LOCATION`-Amazon-S3-Bucket, um das Ziel Ihrer Elastic-Load-Balancing-Protokolle anzugeben.

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage wird die Tabelle `elb_logs` von Athena registriert, sodass Sie die darin enthaltenen Daten für Abfragen nutzen können. Weitere Informationen finden Sie unter [Beispielabfragen](#query-elb-classic-example).

## Beispielabfragen
<a name="query-elb-classic-example"></a>

Verwenden Sie eine ähnliche Abfrage wie im folgenden Beispiel. Die Abfrage listet die Backend-Anwendungsserver auf, die den Fehlercode `4XX` oder `5XX` zurückgegeben haben. Mit dem Operator `LIMIT` lässt sich die Anzahl der im gleichen Schritt abzufragenden Protokolle einschränken.

```
SELECT
 timestamp,
 elb_name,
 backend_ip,
 backend_response_code
FROM elb_logs
WHERE backend_response_code LIKE '4%' OR
      backend_response_code LIKE '5%'
LIMIT 100;
```

Mit einer weiteren Abfrage fassen Sie die Reaktionszeit aller Transaktionen gruppiert nach Backend-IP-Adresse und Elastic-Load-Balancing-Instance-Namen zusammen.

```
SELECT sum(backend_processing_time) AS
 total_ms,
 elb_name,
 backend_ip
FROM elb_logs WHERE backend_ip <> ''
GROUP BY backend_ip, elb_name
LIMIT 100;
```

Weitere Informationen finden Sie unter [Analyzing Data in S3 using Athena](https://aws.amazon.com/blogs/big-data/analyzing-data-in-s3-using-amazon-athena/).

# CloudFront Amazon-Logs abfragen
<a name="cloudfront-logs"></a>

Sie können Amazon CloudFront CDN so konfigurieren, dass Zugriffsprotokolle für die Webdistribution nach Amazon Simple Storage Service exportiert werden. Verwenden Sie diese Protokolle, um das Surfverhalten der Benutzer auf Ihren Websites zu untersuchen, die von CloudFront bereitgestellt werden.

Bevor Sie mit der Abfrage der Protokolle beginnen, aktivieren Sie das Zugriffsprotokoll für Web-Verteilungen für die gewünschte CloudFront -Verteilung. Weitere Informationen finden Sie unter [Zugriffsprotokolle](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html) im *Amazon CloudFront Developer Guide*. Notieren Sie den Amazon-S3-Bucket, in dem Sie diese Protokolle speichern.

**Topics**
+ [Erstellen Sie eine Tabelle für CloudFront Standardprotokolle (Legacy)](create-cloudfront-table-standard-logs.md)
+ [Erstellen Sie eine Tabelle für CloudFront Logs in Athena mithilfe manueller Partitionierung mit JSON](create-cloudfront-table-manual-json.md)
+ [Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der manuellen Partitionierung mit Parquet](create-cloudfront-table-manual-parquet.md)
+ [Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der Partitionsprojektion mit JSON](create-cloudfront-table-partition-json.md)
+ [Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der Partitionsprojektion mit Parquet](create-cloudfront-table-partition-parquet.md)
+ [Erstellen Sie eine Tabelle für CloudFront Echtzeitprotokolle](create-cloudfront-table-real-time-logs.md)
+ [Weitere Ressourcen](cloudfront-logs-additional-resources.md)

# Erstellen Sie eine Tabelle für CloudFront Standardprotokolle (Legacy)
<a name="create-cloudfront-table-standard-logs"></a>

**Anmerkung**  
Das folgende Verfahren funktioniert für die Anmeldung des Zugriffs auf die Webdistribution CloudFront. Es kann nicht für Streaming-Protokolle von RTMP-Verteilungen eingesetzt werden.

**Um eine Tabelle für CloudFront standardmäßige Protokolldateifelder zu erstellen**

1. Kopieren Sie die folgende beispielhafte DDL-Anweisung und fügen Sie sie in den Abfrageeditor der Athena-Konsole ein. Die Beispielanweisung verwendet die Protokolldateifelder, die im Abschnitt [Standard-Protokolldateifelder](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) des *Amazon CloudFront Developer Guide* dokumentiert sind. Ändern Sie `LOCATION` in den Amazon-S3-Bucket, in dem die Protokolle gespeichert werden. Weitere Informationen zur Verwendung des visuellen Abfrage-Editors finden Sie unter [Erste Schritte](getting-started.md).

   Diese Abfrage spezifiziert `ROW FORMAT DELIMITED` und `FIELDS TERMINATED BY '\t'` um anzugeben, dass die Felder durch Tabulatorzeichen getrennt sind. Denn `ROW FORMAT DELIMITED` Athena verwendet [LazySimpleSerDe](lazy-simple-serde.md)standardmäßig das. Die Spalte `date` ist mit Escape-Zeichen – einfachen umgekehrten Anführungszeichen (`) – versehen, da es sich um ein reserviertes Wort in Athena handelt. Weitere Informationen finden Sie unter [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md).

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_standard_logs (
     `date` DATE,
     time STRING,
     x_edge_location STRING,
     sc_bytes BIGINT,
     c_ip STRING,
     cs_method STRING,
     cs_host STRING,
     cs_uri_stem STRING,
     sc_status INT,
     cs_referrer STRING,
     cs_user_agent STRING,
     cs_uri_query STRING,
     cs_cookie STRING,
     x_edge_result_type STRING,
     x_edge_request_id STRING,
     x_host_header STRING,
     cs_protocol STRING,
     cs_bytes BIGINT,
     time_taken FLOAT,
     x_forwarded_for STRING,
     ssl_protocol STRING,
     ssl_cipher STRING,
     x_edge_response_result_type STRING,
     cs_protocol_version STRING,
     fle_status STRING,
     fle_encrypted_fields INT,
     c_port INT,
     time_to_first_byte FLOAT,
     x_edge_detailed_result_type STRING,
     sc_content_type STRING,
     sc_content_len BIGINT,
     sc_range_start BIGINT,
     sc_range_end BIGINT
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `cloudfront_standard_logs`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

## Beispielabfragen
<a name="query-examples-cloudfront-logs"></a>

Die folgende Abfrage summiert die Anzahl der Byte, die CloudFront zwischen dem 9. Juni und dem 11. Juni 2018 bedient wurden. Setzen Sie den Spaltennamen "date" in doppelte Anführungszeichen, da es sich um ein reserviertes Wort handelt.

```
SELECT SUM(bytes) AS total_bytes
FROM cloudfront_standard_logs
WHERE "date" BETWEEN DATE '2018-06-09' AND DATE '2018-06-11'
LIMIT 100;
```

Um doppelte Zeilen (z. B. doppelte Leerzeilen) aus den Abfrageergebnissen zu entfernen, können Sie, wie im folgenden Beispiel die `SELECT DISTINCT`-Anweisung verwenden. 

```
SELECT DISTINCT * 
FROM cloudfront_standard_logs 
LIMIT 10;
```

# Erstellen Sie eine Tabelle für CloudFront Logs in Athena mithilfe manueller Partitionierung mit JSON
<a name="create-cloudfront-table-manual-json"></a>

**Um eine Tabelle für CloudFront Standard-Protokolldateifelder im JSON-Format zu erstellen**

1. Kopieren Sie die folgende beispielhafte DDL-Anweisung und fügen Sie sie in den Abfrageeditor der Athena-Konsole ein. Die Beispielanweisung verwendet die Protokolldateifelder, die im Abschnitt [Standard-Protokolldateifelder](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) des *Amazon CloudFront Developer Guide* dokumentiert sind. Ändern Sie `LOCATION` in den Amazon-S3-Bucket, in dem die Protokolle gespeichert werden. 

   Diese Abfrage verwendet OpenX JSON SerDe mit den folgenden SerDe Eigenschaften, um JSON-Felder in Athena korrekt zu lesen.

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_json`(
     `date` string , 
     `time` string , 
     `x-edge-location` string , 
     `sc-bytes` string , 
     `c-ip` string , 
     `cs-method` string , 
     `cs(host)` string , 
     `cs-uri-stem` string , 
     `sc-status` string , 
     `cs(referer)` string , 
     `cs(user-agent)` string , 
     `cs-uri-query` string , 
     `cs(cookie)` string , 
     `x-edge-result-type` string , 
     `x-edge-request-id` string , 
     `x-host-header` string , 
     `cs-protocol` string , 
     `cs-bytes` string , 
     `time-taken` string , 
     `x-forwarded-for` string , 
     `ssl-protocol` string , 
     `ssl-cipher` string , 
     `x-edge-response-result-type` string , 
     `cs-protocol-version` string , 
     `fle-status` string , 
     `fle-encrypted-fields` string , 
     `c-port` string , 
     `time-to-first-byte` string , 
     `x-edge-detailed-result-type` string , 
     `sc-content-type` string , 
     `sc-content-len` string , 
     `sc-range-start` string , 
     `sc-range-end` string )
   ROW FORMAT SERDE 
     'org.openx.data.jsonserde.JsonSerDe' 
   WITH SERDEPROPERTIES ( 
     'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.mapred.TextInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `cf_logs_manual_partition_json`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

## Beispielabfragen
<a name="query-examples-cloudfront-logs-manual-json"></a>

Die folgende Abfrage summiert die Anzahl der Byte, die CloudFront für den 15. Januar 2025 bereitgestellt wurden.

```
SELECT sum(cast("sc-bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_json
WHERE "date"='2025-01-15'
```

Um doppelte Zeilen (z. B. doppelte Leerzeilen) aus den Abfrageergebnissen zu entfernen, können Sie, wie im folgenden Beispiel die `SELECT DISTINCT`-Anweisung verwenden. 

```
SELECT DISTINCT * FROM cf_logs_manual_partition_json
```

# Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der manuellen Partitionierung mit Parquet
<a name="create-cloudfront-table-manual-parquet"></a>

**Um eine Tabelle für CloudFront Standard-Protokolldateifelder im Parquet-Format zu erstellen**

1. Kopieren Sie die folgende beispielhafte DDL-Anweisung und fügen Sie sie in den Abfrageeditor der Athena-Konsole ein. Die Beispielanweisung verwendet die Protokolldateifelder, die im Abschnitt [Standard-Protokolldateifelder](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) des *Amazon CloudFront Developer Guide* dokumentiert sind. 

   Diese Abfrage verwendet ParquetHiveSerDe die folgenden SerDe Eigenschaften, um Parquet-Felder in Athena korrekt zu lesen.

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_parquet`(
     `date` string, 
     `time` string, 
     `x_edge_location` string, 
     `sc_bytes` string, 
     `c_ip` string, 
     `cs_method` string, 
     `cs_host` string, 
     `cs_uri_stem` string, 
     `sc_status` string, 
     `cs_referer` string, 
     `cs_user_agent` string, 
     `cs_uri_query` string, 
     `cs_cookie` string, 
     `x_edge_result_type` string, 
     `x_edge_request_id` string, 
     `x_host_header` string, 
     `cs_protocol` string, 
     `cs_bytes` string, 
     `time_taken` string, 
     `x_forwarded_for` string, 
     `ssl_protocol` string, 
     `ssl_cipher` string, 
     `x_edge_response_result_type` string, 
     `cs_protocol_version` string, 
     `fle_status` string, 
     `fle_encrypted_fields` string, 
     `c_port` string, 
     `time_to_first_byte` string, 
     `x_edge_detailed_result_type` string, 
     `sc_content_type` string, 
     `sc_content_len` string, 
     `sc_range_start` string, 
     `sc_range_end` string)
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `cf_logs_manual_partition_parquet`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

## Beispielabfragen
<a name="query-examples-cloudfront-logs-manual-parquet"></a>

Die folgende Abfrage summiert die Anzahl der Byte, die CloudFront für den 19. Januar 2025 bereitgestellt wurden.

```
SELECT sum(cast("sc_bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_parquet
WHERE "date"='2025-01-19'
```

Um doppelte Zeilen (z. B. doppelte Leerzeilen) aus den Abfrageergebnissen zu entfernen, können Sie, wie im folgenden Beispiel die `SELECT DISTINCT`-Anweisung verwenden. 

```
SELECT DISTINCT * FROM cf_logs_manual_partition_parquet
```

# Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der Partitionsprojektion mit JSON
<a name="create-cloudfront-table-partition-json"></a>

Mit der Athena-Partitionsprojektions-Feature können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung automatisieren. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von `ALTER TABLE ADD PARTITION` hinzuzufügen.

Die folgende CREATE TABLE-Beispielanweisung verwendet automatisch die Partitionsprojektion für CloudFront Protokolle aus einer bestimmten CloudFront Distribution, bis sie für eine einzelne AWS-Region Distribution vorhanden ist. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen.

```
CREATE EXTERNAL TABLE `cloudfront_logs_pp`(
  `date` string, 
  `time` string, 
  `x-edge-location` string, 
  `sc-bytes` string, 
  `c-ip` string, 
  `cs-method` string, 
  `cs(host)` string, 
  `cs-uri-stem` string, 
  `sc-status` string, 
  `cs(referer)` string, 
  `cs(user-agent)` string, 
  `cs-uri-query` string, 
  `cs(cookie)` string, 
  `x-edge-result-type` string, 
  `x-edge-request-id` string, 
  `x-host-header` string, 
  `cs-protocol` string, 
  `cs-bytes` string, 
  `time-taken` string, 
  `x-forwarded-for` string, 
  `ssl-protocol` string, 
  `ssl-cipher` string, 
  `x-edge-response-result-type` string, 
  `cs-protocol-version` string, 
  `fle-status` string, 
  `fle-encrypted-fields` string, 
  `c-port` string, 
  `time-to-first-byte` string, 
  `x-edge-detailed-result-type` string, 
  `sc-content-type` string, 
  `sc-content-len` string, 
  `sc-range-start` string, 
  `sc-range-end` string)
  PARTITIONED BY(
         distributionid string,
         year int,
         month int,
         day int,
         hour int )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 
  'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
  'projection.distributionid.type'='enum',
  'projection.distributionid.values'='E2Oxxxxxxxxxxx',
  'projection.day.range'='01,31', 
  'projection.day.type'='integer', 
  'projection.day.digits'='2', 
  'projection.enabled'='true', 
  'projection.month.range'='01,12', 
  'projection.month.type'='integer', 
  'projection.month.digits'='2', 
  'projection.year.range'='2025,2026', 
  'projection.year.type'='integer', 
  'projection.hour.range'='00,23',
  'projection.hour.type'='integer',
  'projection.hour.digits'='2',
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

Im Folgenden finden Sie einige Überlegungen zu den im vorherigen Beispiel verwendeten Eigenschaften.
+ **Tabellenname** – Der Tabellenname *`cloudfront_logs_pp`* ist austauschbar. Sie können ihn in einen beliebigen Namen ändern.
+ **Standort** – Ändern Sie `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/` so dass er auf Ihren Amazon-S3-Bucket verweist.
+ **Verteilung IDs** — Für können Sie mehrere Verteilungen angeben`projection.distributionid.values`, IDs wenn Sie sie durch Kommas trennen. Zum Beispiel *<distributionID1>*, *<distributionID2>*.
+ **Jahresbereich** – In `projection.year.range` können Sie den Jahresbereich auf der Grundlage Ihrer Daten definieren. Sie können ihn beispielsweise an einen beliebigen Zeitraum anpassen, z. B. *2025*, *2026*.
**Anmerkung**  
Das Einbeziehen leerer Partitionen, z. B. für future Daten (Beispiel: 2025-2040), kann sich auf die Abfrageleistung auswirken. Die Partitionsprojektion ist jedoch so konzipiert, dass zukünftige Daten effektiv verarbeiten werden können. Um eine optimale Leistung zu gewährleisten, sollten Sie sicherstellen, dass die Partitionen sorgfältig verwaltet werden, und vermeiden Sie, wenn möglich, übermäßige leere Partitionen.
+ **Vorlage für den Speicherort** — Sie müssen sicherstellen, dass die Vorlage auf der Grundlage der folgenden CloudFront Partitionierungsstruktur und des folgenden S3-Pfads `storage.location.template` korrekt aktualisiert wird.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/create-cloudfront-table-partition-json.html)

  Nachdem Sie sich vergewissert haben, dass die CloudFront Partitionierungsstruktur und die S3-Struktur den erforderlichen Mustern entsprechen, aktualisieren Sie Folgendes`storage.location.template`:

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**Anmerkung**  
Die richtige Konfiguration von `storage.location.template` ist entscheidend für die korrekte Datenspeicherung und den korrekten Abruf von Daten.

# Erstellen Sie eine Tabelle für CloudFront Protokolle in Athena mithilfe der Partitionsprojektion mit Parquet
<a name="create-cloudfront-table-partition-parquet"></a>

Die folgende CREATE TABLE-Beispielanweisung verwendet automatisch die Partitionsprojektion für CloudFront Logs in Parquet, und zwar von einer bestimmten CloudFront Distribution bis zum Vorhandensein einer einzelnen AWS-Region Distribution. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen.

```
CREATE EXTERNAL TABLE `cloudfront_logs_parquet_pp`(
`date` string, 
`time` string, 
`x_edge_location` string, 
`sc_bytes` string, 
`c_ip` string, 
`cs_method` string, 
`cs_host` string, 
`cs_uri_stem` string, 
`sc_status` string, 
`cs_referer` string, 
`cs_user_agent` string, 
`cs_uri_query` string, 
`cs_cookie` string, 
`x_edge_result_type` string, 
`x_edge_request_id` string, 
`x_host_header` string, 
`cs_protocol` string, 
`cs_bytes` string, 
`time_taken` string, 
`x_forwarded_for` string, 
`ssl_protocol` string, 
`ssl_cipher` string, 
`x_edge_response_result_type` string, 
`cs_protocol_version` string, 
`fle_status` string, 
`fle_encrypted_fields` string, 
`c_port` string, 
`time_to_first_byte` string, 
`x_edge_detailed_result_type` string, 
`sc_content_type` string, 
`sc_content_len` string, 
`sc_range_start` string, 
`sc_range_end` string)
PARTITIONED BY(
 distributionid string,
 year int,
 month int,
 day int,
 hour int )
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
'projection.distributionid.type'='enum',
'projection.distributionid.values'='E3OK0LPUNWWO3',
'projection.day.range'='01,31',
'projection.day.type'='integer',
'projection.day.digits'='2',
'projection.enabled'='true',
'projection.month.range'='01,12',
'projection.month.type'='integer',
'projection.month.digits'='2',
'projection.year.range'='2019,2025',
'projection.year.type'='integer',
'projection.hour.range'='01,12',
'projection.hour.type'='integer',
'projection.hour.digits'='2',
'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

Im Folgenden finden Sie einige Überlegungen zu den im vorherigen Beispiel verwendeten Eigenschaften.
+ **Tabellenname** – Der Tabellenname *`cloudfront_logs_pp`* ist austauschbar. Sie können ihn in einen beliebigen Namen ändern.
+ **Standort** – Ändern Sie `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/` so dass er auf Ihren Amazon-S3-Bucket verweist.
+ **Verteilung IDs** — Für können Sie mehrere Verteilungen angeben`projection.distributionid.values`, IDs wenn Sie sie durch Kommas trennen. Zum Beispiel *<distributionID1>*, *<distributionID2>*.
+ **Jahresbereich** – In `projection.year.range` können Sie den Jahresbereich auf der Grundlage Ihrer Daten definieren. Sie können ihn beispielsweise an einen beliebigen Zeitraum anpassen, z. B. *2025*, *2026*.
**Anmerkung**  
Das Einbeziehen leerer Partitionen, z. B. für future Daten (Beispiel: 2025-2040), kann sich auf die Abfrageleistung auswirken. Die Partitionsprojektion ist jedoch so konzipiert, dass zukünftige Daten effektiv verarbeiten werden können. Um eine optimale Leistung zu gewährleisten, sollten Sie sicherstellen, dass die Partitionen sorgfältig verwaltet werden, und vermeiden Sie, wenn möglich, übermäßige leere Partitionen.
+ **Vorlage für den Speicherort** — Sie müssen sicherstellen, dass die Vorlage auf der Grundlage der folgenden CloudFront Partitionierungsstruktur und des folgenden S3-Pfads `storage.location.template` korrekt aktualisiert wird.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/create-cloudfront-table-partition-parquet.html)

  Nachdem Sie sich vergewissert haben, dass die CloudFront Partitionierungsstruktur und die S3-Struktur den erforderlichen Mustern entsprechen, aktualisieren Sie Folgendes`storage.location.template`:

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**Anmerkung**  
Die richtige Konfiguration von `storage.location.template` ist entscheidend für die korrekte Datenspeicherung und den korrekten Abruf von Daten.

# Erstellen Sie eine Tabelle für CloudFront Echtzeitprotokolle
<a name="create-cloudfront-table-real-time-logs"></a>

**Um eine Tabelle für CloudFront Echtzeit-Protokolldateifelder zu erstellen**

1. Kopieren Sie die folgende beispielhafte DDL-Anweisung und fügen Sie sie in den Abfrageeditor der Athena-Konsole ein. Die Beispielanweisung verwendet die Protokolldateifelder, die im Abschnitt [Echtzeitprotokolle](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html) des *Amazon CloudFront Developer Guide* dokumentiert sind. Ändern Sie `LOCATION` in den Amazon-S3-Bucket, in dem die Protokolle gespeichert werden. Weitere Informationen zur Verwendung des visuellen Abfrage-Editors finden Sie unter [Erste Schritte](getting-started.md).

   Diese Abfrage spezifiziert `ROW FORMAT DELIMITED` und `FIELDS TERMINATED BY '\t'` um anzugeben, dass die Felder durch Tabulatorzeichen getrennt sind. Denn `ROW FORMAT DELIMITED` Athena verwendet [LazySimpleSerDe](lazy-simple-serde.md)standardmäßig das. Die Spalte `timestamp` ist mit Escape-Zeichen – einfachen umgekehrten Anführungszeichen (`) – versehen, da es sich um ein reserviertes Wort in Athena handelt. Weitere Informationen finden Sie unter [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md).

   Das folgende Beispiel enthält alle verfügbaren Felder. Sie können nicht benötigte Felder auskommentieren oder entfernen.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_real_time_logs ( 
   `timestamp` STRING,
   c_ip STRING,
   time_to_first_byte BIGINT,
   sc_status BIGINT,
   sc_bytes BIGINT,
   cs_method STRING,
   cs_protocol STRING,
   cs_host STRING,
   cs_uri_stem STRING,
   cs_bytes BIGINT,
   x_edge_location STRING,
   x_edge_request_id STRING,
   x_host_header STRING,
   time_taken BIGINT,
   cs_protocol_version STRING,
   c_ip_version STRING,
   cs_user_agent STRING,
   cs_referer STRING,
   cs_cookie STRING,
   cs_uri_query STRING,
   x_edge_response_result_type STRING,
   x_forwarded_for STRING,
   ssl_protocol STRING,
   ssl_cipher STRING,
   x_edge_result_type STRING,
   fle_encrypted_fields STRING,
   fle_status STRING,
   sc_content_type STRING,
   sc_content_len BIGINT,
   sc_range_start STRING,
   sc_range_end STRING,
   c_port BIGINT,
   x_edge_detailed_result_type STRING,
   c_country STRING,
   cs_accept_encoding STRING,
   cs_accept STRING,
   cache_behavior_path_pattern STRING,
   cs_headers STRING,
   cs_header_names STRING,
   cs_headers_count BIGINT,
   primary_distribution_id STRING,
   primary_distribution_dns_name STRING,
   origin_fbl STRING,
   origin_lbl STRING,
   asn STRING
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `cloudfront_real_time_logs`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

# Weitere Ressourcen
<a name="cloudfront-logs-additional-resources"></a>

Weitere Informationen zur Verwendung von Athena zum Abfragen von CloudFront Protokollen finden Sie in den folgenden Beiträgen aus dem [AWS Big-Data-Blog](https://aws.amazon.com/blogs/big-data/).

[Einfache Abfrage von AWS-Service Protokollen mit Amazon Athena](https://aws.amazon.com/blogs/big-data/easily-query-aws-service-logs-using-amazon-athena/) (29. Mai 2019).

[Analysieren Sie Ihre CloudFront Amazon-Zugriffsprotokolle in großem Umfang](https://aws.amazon.com/blogs/big-data/analyze-your-amazon-cloudfront-access-logs-at-scale/) (21. Dezember 2018).

[Erstellen Sie eine serverlose Architektur zur Analyse von CloudFront Amazon-Zugriffsprotokollen mithilfe von AWS Lambda Amazon Athena und Amazon Managed Service für Apache Flink](https://aws.amazon.com/blogs/big-data/build-a-serverless-architecture-to-analyze-amazon-cloudfront-access-logs-using-aws-lambda-amazon-athena-and-amazon-kinesis-analytics/) (26. Mai 2017).

# AWS CloudTrail Logs abfragen
<a name="cloudtrail-logs"></a>

AWS CloudTrail ist ein Service, der AWS API-Aufrufe und Ereignisse für Amazon Web Services Services-Konten aufzeichnet. 

CloudTrail Protokolle enthalten Details zu allen API-Aufrufen, die an Sie AWS-Services, einschließlich der Konsole, getätigt wurden. CloudTrail generiert verschlüsselte Protokolldateien und speichert sie in Amazon S3. Weitere Informationen finden Sie im [AWS CloudTrail -Benutzerhandbuch](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html). 

**Anmerkung**  
Wenn Sie SQL-Abfragen zu CloudTrail Ereignisinformationen für Konten, Regionen und Daten durchführen möchten, sollten Sie CloudTrail Lake in Betracht ziehen. CloudTrail Lake ist eine AWS Alternative zur Erstellung von Pfaden, bei denen Informationen aus einem Unternehmen in einem einzigen, durchsuchbaren Ereignisdatenspeicher zusammengefasst werden. Anstatt Amazon-S3-Bucket-Speicher zu verwenden, speichert es Ereignisse in einem Data Lake, was umfangreichere und schnellere Abfragen ermöglicht. Sie können damit SQL-Abfragen erstellen, die Ereignisse in Organisationen, Regionen und innerhalb benutzerdefinierter Zeitbereiche suchen. Da Sie CloudTrail Lake-Abfragen innerhalb der CloudTrail Konsole selbst durchführen, ist für die Verwendung von CloudTrail Lake Athena nicht erforderlich. Weitere Informationen finden Sie in der [CloudTrail Lake-Dokumentation](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html).

Die Verwendung von Athena mit CloudTrail Protokollen ist eine leistungsstarke Methode, um Ihre AWS-Service Aktivitätsanalyse zu verbessern. Beispielsweise können Sie mithilfe von Abfragen Trends ermitteln und Vorgänge nach Attributen (z. B. Quell-IP-Adresse oder Benutzer) trennen.

Eine gängige Anwendung ist die Verwendung von CloudTrail Protokollen zur Analyse betrieblicher Aktivitäten im Hinblick auf Sicherheit und Compliance. Informationen zu einem ausführlichen Beispiel finden Sie im AWS Big-Data-Blogbeitrag [Analysieren von Sicherheit, Compliance und betrieblichen Aktivitäten mithilfe von AWS CloudTrail Amazon Athena](https://aws.amazon.com/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/).

Mithilfe von Athena können Sie diese Protokolldateien direkt aus Amazon S3 abrufen, wenn Sie die `LOCATION` der Protokolldateien angeben. Dafür stehen Ihnen zwei Optionen zur Verfügung:
+ Indem Sie Tabellen für CloudTrail Protokolldateien direkt von der CloudTrail Konsole aus erstellen.
+ Durch manuelles Erstellen von Tabellen für CloudTrail Protokolldateien in der Athena-Konsole.

**Topics**
+ [CloudTrail Logs und Athena-Tabellen verstehen](create-cloudtrail-table-understanding.md)
+ [Verwenden Sie die CloudTrail Konsole, um eine Athena-Tabelle für CloudTrail Protokolle zu erstellen](create-cloudtrail-table-ct.md)
+ [Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung](create-cloudtrail-table.md)
+ [Erstellen einer Tabelle für einen organisationsweiten Trail mit manueller Partitionierung](create-cloudtrail-table-org-wide-trail.md)
+ [Erstellen Sie die Tabelle für CloudTrail Protokolle in Athena mithilfe der Partitionsprojektion](create-cloudtrail-table-partition-projection.md)
+ [Beispiel für CloudTrail Protokollabfragen](query-examples-cloudtrail-logs.md)

# CloudTrail Logs und Athena-Tabellen verstehen
<a name="create-cloudtrail-table-understanding"></a>

Bevor Sie mit der Erstellung von Tabellen beginnen, sollten Sie ein wenig mehr darüber CloudTrail wissen, wie es Daten speichert. Dies kann Ihnen helfen, die Tabellen zu erstellen, die Sie benötigen, unabhängig davon, ob Sie sie von der CloudTrail Konsole oder von Athena aus erstellen.

CloudTrail speichert Protokolle als JSON-Textdateien im komprimierten Gzip-Format ()`*.json.gz`. Der Speicherort der Protokolldateien hängt davon ab, wie Sie die Pfade einrichten, von den AWS-Region Regionen, in denen Sie protokollieren, und von anderen Faktoren. 

Weitere Informationen zum Speicherort der Protokolldateien, der JSON-Struktur und den Datensatzinhalten finden Sie unter folgenden Themen im [AWS CloudTrail -Benutzerhandbuch](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html):
+  [Finden Sie Ihre CloudTrail Logdateien](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-find-log-files.html) 
+  [CloudTrail Beispiele für Protokolldateien](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-log-file-examples.html) 
+  [CloudTrail Inhalt aufzeichnen](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)
+  [CloudTrail Referenz zum Ereignis](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference.html) 

Um Protokolle zu sammeln und in Amazon S3 zu speichern, aktivieren Sie die CloudTrail Option über AWS-Managementkonsole. Weitere Informationen finden Sie unter [Erstellen eines Trails](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html) im *Benutzerhandbuch für AWS CloudTrail *.

# Verwenden Sie die CloudTrail Konsole, um eine Athena-Tabelle für CloudTrail Protokolle zu erstellen
<a name="create-cloudtrail-table-ct"></a>

Sie können eine nicht partitionierte Athena-Tabelle für die Abfrage von CloudTrail Protokollen direkt von der Konsole aus erstellen. CloudTrail Um eine Athena-Tabelle von der CloudTrail Konsole aus zu erstellen, müssen Sie mit einer Rolle angemeldet sein, die über ausreichende Berechtigungen zum Erstellen von Tabellen in Athena verfügt.

**Anmerkung**  
Sie können die CloudTrail Konsole nicht verwenden, um eine Athena-Tabelle für Organization Trail Logs zu erstellen. Erstellen Sie stattdessen die Tabelle manuell mit der Athena-Konsole, damit Sie den richtigen Speicherort angeben können. Weitere Informationen zu Organisation-Trails finden Sie unter [Erstellen eines Trails für eine Organisation](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/creating-trail-organization.html) im *AWS CloudTrail -Benutzerhandbuch*.
+ Informationen zum Festlegen von Athena-Berechtigungen finden Sie unter [Einrichtung, administrativer und programmatischer Zugriff](setting-up.md).
+ Weitere Informationen zum Erstellen einer Tabelle mit Partitionen finden Sie unter [Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung](create-cloudtrail-table.md).

**So erstellen Sie mit der Konsole eine Athena-Tabelle für einen CloudTrail Trail CloudTrail**

1. Öffnen Sie die CloudTrail Konsole unter. [https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/)

1. Wählen Sie im Navigationsbereich **Ereignisverlauf** aus. 

1. Wählen Sie **Create Athena table** (Erstellen der Athena-Tabelle).  
![\[Wählen Sie Create Athena table (Erstellen der Athena-Tabelle)\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/cloudtrail-logs-create-athena-table.png)

1. Verwenden Sie für den **Speicherort** den Abwärtspfeil, um den Amazon-S3-Bucket auszuwählen, in dem Protokolldateien für den abzufragenden Trail gespeichert werden.
**Anmerkung**  
Um den Namen des Buckets zu finden, der mit einem Trail verknüpft ist, wählen Sie im CloudTrail Navigationsbereich **Trails** aus und sehen Sie sich die **S3-Bucket-Spalte** des Trails an. Um die Position des Buckets in Amazon S3 anzuzeigen, wählen Sie den Link für den Bucket in der **S3-Bucket**-Spalte aus. Dadurch wird die Amazon S3 S3-Konsole mit dem CloudTrail Bucket-Standort geöffnet. 

1. Wählen Sie **Create table** (Tabelle erstellen) aus. Die Tabelle wird mit einem Standardnamen erstellt, in dem der Name des Amazon-S3-Buckets enthalten ist.

# Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung
<a name="create-cloudtrail-table"></a>

Sie können manuell Tabellen für CloudTrail Protokolldateien in der Athena-Konsole erstellen und dann Abfragen in Athena ausführen.

**So erstellen Sie mit der Athena-Konsole eine Athena-Tabelle für einen CloudTrail Trail**

1. Kopieren Sie die folgende DDL-Anweisung, fügen Sie sie in den Abfrage-Editor der Athena-Konsole ein und ändern Sie sie dann entsprechend Ihren Anforderungen. Beachten Sie, dass die Felder in den CloudTrail Protokolldateien nicht in einer bestimmten Reihenfolge angezeigt werden, da es sich bei Protokolldateien nicht um einen geordneten Stack-Trace von öffentlichen API-Aufrufen handelt.

   ```
   CREATE EXTERNAL TABLE cloudtrail_logs (
   eventversion STRING,
   useridentity STRUCT<
                  type:STRING,
                  principalid:STRING,
                  arn:STRING,
                  accountid:STRING,
                  invokedby:STRING,
                  accesskeyid:STRING,
                  username:STRING,
                  onbehalfof: STRUCT<
                       userid: STRING,
                       identitystorearn: STRING>,
     sessioncontext:STRUCT<
       attributes:STRUCT<
                  mfaauthenticated:STRING,
                  creationdate:STRING>,
       sessionissuer:STRUCT<  
                  type:STRING,
                  principalid:STRING,
                  arn:STRING, 
                  accountid:STRING,
                  username:STRING>,
       ec2roledelivery:string,
       webidfederationdata: STRUCT<
                  federatedprovider: STRING,
                  attributes: map<string,string>>
     >
   >,
   eventtime STRING,
   eventsource STRING,
   eventname STRING,
   awsregion STRING,
   sourceipaddress STRING,
   useragent STRING,
   errorcode STRING,
   errormessage STRING,
   requestparameters STRING,
   responseelements STRING,
   additionaleventdata STRING,
   requestid STRING,
   eventid STRING,
   resources ARRAY<STRUCT<
                  arn:STRING,
                  accountid:STRING,
                  type:STRING>>,
   eventtype STRING,
   apiversion STRING,
   readonly STRING,
   recipientaccountid STRING,
   serviceeventdetails STRING,
   sharedeventid STRING,
   vpcendpointid STRING,
   vpcendpointaccountid STRING,
   eventcategory STRING,
   addendum STRUCT<
     reason:STRING,
     updatedfields:STRING,
     originalrequestid:STRING,
     originaleventid:STRING>,
   sessioncredentialfromconsole STRING,
   edgedevicedetails STRING,
   tlsdetails STRUCT<
     tlsversion:STRING,
     ciphersuite:STRING,
     clientprovidedhostheader:STRING>
   )
   PARTITIONED BY (region string, year string, month string, day string)
   ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
   STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/';
   ```
**Anmerkung**  
Wir empfehlen, die im Beispiel gezeigte `org.apache.hive.hcatalog.data.JsonSerDe` zu verwenden. Obwohl a `com.amazon.emr.hive.serde.CloudTrailSerde` existiert, verarbeitet es derzeit einige der neueren CloudTrail Felder nicht. 

1. (Optional) Entfernen Sie alle für Ihre Tabelle nicht benötigten Felder. Wenn Sie nur eine bestimmte Gruppe von Spalten lesen müssen, kann Ihre Tabellendefinition die anderen Spalten ausschließen.

1. Ändern Sie `s3://amzn-s3-demo-bucket/AWSLogs/Account_ID/` so, dass es auf den Amazon-S3-Bucket verweist, der die Log-Daten enthält, die Sie abfragen möchten. Im Beispiel wird der Wert `LOCATION` für Protokolle eines bestimmten Kontos verwendet, aber Sie können den Grad an Spezifität angeben, der für Ihre Anwendung erforderlich ist. Beispiel:
   + Für die Datenanalyse von mehreren Konten können Sie den Bezeichner `LOCATION` zurücksetzen und dann mit `LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/'` alle `AWSLogs` angeben.
   + Zur Analyse der Daten von einem bestimmten Datum, Konto und Region verwenden Sie `LOCATION 's3://amzn-s3-demo-bucket/123456789012/CloudTrail/us-east-1/2016/03/14/'.` 
   + Um Netzwerkaktivitätsdaten anstelle von Verwaltungsereignissen zu analysieren, ersetzen Sie `/CloudTrail/` in der `LOCATION`-Klausel durch `/CloudTrail-NetworkActivity/`. 

   Die oberste Ebene der Objekthierarchie bietet bei Abfragen mit Athena die größte Flexibilität.

1. Überprüfen Sie, ob die Felder korrekt aufgeführt werden. Weitere Informationen zur vollständigen Liste der Felder in einem CloudTrail Datensatz finden Sie unter [CloudTrail Datensatzinhalt](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

   Die `CREATE TABLE`-Beispielanweisung in Schritt 1 verwendet [Hive-JSON SerDe](hive-json-serde.md). In diesem Beispiel werden die Felder `requestparameters`, `responseelements` und `additionaleventdata` als `STRING`-Typ in der Abfrage aufgelistet, stellen jedoch den `STRUCT`-Datentyp dar, der in JSON verwendet wird. Um aus diesen Feldern Daten zu extrahieren, müssen Sie daher `JSON_EXTRACT`-Funktionen verwenden. Weitere Informationen finden Sie unter [Extrahieren Sie JSON-Daten aus Zeichenfolgen](extracting-data-from-JSON.md). Um die Leistung zu verbessern, partitioniert das Beispiel die Daten nach Jahr AWS-Region, Monat und Tag.

1. Führen Sie die `CREATE TABLE`-Anweisung in der Athena-Konsole aus.

1. Verwenden Sie den Befehl [ALTER TABLE ADD PARTITION](alter-table-add-partition.md), um die Partitionen zu laden, sodass Sie sie abfragen können, wie im folgenden Beispiel.

   ```
   ALTER TABLE table_name ADD 
      PARTITION (region='us-east-1',
                 year='2019',
                 month='02',
                 day='01')
      LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'
   ```

# Erstellen einer Tabelle für einen organisationsweiten Trail mit manueller Partitionierung
<a name="create-cloudtrail-table-org-wide-trail"></a>

Um eine Tabelle für organisationsweite CloudTrail Protokolldateien in Athena zu erstellen, folgen Sie den Schritten unter[Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung](create-cloudtrail-table.md), nehmen Sie jedoch die im folgenden Verfahren angegebenen Änderungen vor.

**So erstellen Sie eine Athena-Tabelle für organisationsweite Protokolle CloudTrail**

1. Ändern Sie in der `CREATE TABLE`-Anweisung die `LOCATION`-Klausel so, dass sie die Organisations-ID enthält, wie im folgenden Beispiel:

   ```
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/'
   ```

1. In der `PARTITIONED BY`-Klausel fügen Sie einen Eintrag für die Konto-ID als Zeichenfolge hinzu, wie im folgenden Beispiel veranschaulicht:

   ```
   PARTITIONED BY (account string, region string, year string, month string, day string)
   ```

   Das folgende Beispiel zeigt das Ergebnis beider Aktionen:

   ```
   ...
   
   PARTITIONED BY (account string, region string, year string, month string, day string) 
   ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
   STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/Account_ID/CloudTrail/'
   ```

1. Fügen Sie in der `ALTER TABLE`-Anweisung die Konto–ID in die `ADD PARTITION`-Klausel ein, wie im folgenden Beispiel veranschaulicht:

   ```
   ALTER TABLE table_name ADD
   PARTITION (account='111122223333',
   region='us-east-1',
   year='2022',
   month='08',
   day='08')
   ```

1. Fügen Sie in der `ALTER TABLE`-Anweisung die Organisations-ID, die Konto-ID und die hinzuzufügende Partition in die `LOCATION`-Klausel ein, wie im folgenden Beispiel veranschaulicht:

   ```
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'
   ```

   Die folgende `ALTER TABLE`-Beispielanweisung zeigt das Ergebnis beider Aktionen:

   ```
   ALTER TABLE table_name ADD
   PARTITION (account='111122223333',
   region='us-east-1',
   year='2022',
   month='08',
   day='08')
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'
   ```

Beachten Sie, dass es in einer großen Organisation umständlich sein kann, diese Methode zum manuellen Hinzufügen und Verwalten einer Partition für jede Unternehmenskonto-ID zu verwenden. In einem solchen Szenario sollten Sie CloudTrail Lake anstelle von Athena verwenden. CloudTrail Lake bietet in einem solchen Szenario die folgenden Vorteile:
+ Aggregiert automatisch Protokolle für eine gesamte Organisation
+ Erfordert keine Einrichtung oder Wartung von Partitionen oder einer Athena-Tabelle
+ Abfragen werden direkt in der CloudTrail Konsole ausgeführt
+ Verwendet eine SQL-kompatible Abfragesprache

Weitere Informationen finden Sie unter [Arbeiten mit AWS CloudTrail-Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html) im-Benutzerhandbuch* für AWS CloudTrail *. 

# Erstellen Sie die Tabelle für CloudTrail Protokolle in Athena mithilfe der Partitionsprojektion
<a name="create-cloudtrail-table-partition-projection"></a>

Da CloudTrail Protokolle eine bekannte Struktur haben, deren Partitionsschema Sie im Voraus angeben können, können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung automatisieren, indem Sie die Athena-Partitionsprojektionsfunktion verwenden. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von `ALTER TABLE ADD PARTITION` hinzuzufügen. 

In der folgenden `CREATE TABLE` Beispielanweisung wird automatisch die Partitionsprojektion für CloudTrail Protokolle von einem bestimmten Datum bis heute für ein einzelnes AWS-Region Protokoll verwendet. Ersetzen Sie in den `storage.location.template` Klauseln `LOCATION` und die *aws-region* Platzhalter *bucket**account-id*, und durch entsprechend identische Werte. Ersetzen Sie für `projection.timestamp.range`*2020*/*01*/*01*durch das Startdatum, das Sie verwenden möchten. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen. Sie müssen `ALTER TABLE ADD PARTITION` nicht ausführen, um die Partitionen zu laden.

```
CREATE EXTERNAL TABLE cloudtrail_logs_pp(
    eventversion STRING,
    useridentity STRUCT<
        type: STRING,
        principalid: STRING,
        arn: STRING,
        accountid: STRING,
        invokedby: STRING,
        accesskeyid: STRING,
        username: STRING,
        onbehalfof: STRUCT<
             userid: STRING,
             identitystorearn: STRING>,
        sessioncontext: STRUCT<
            attributes: STRUCT<
                mfaauthenticated: STRING,
                creationdate: STRING>,
            sessionissuer: STRUCT<
                type: STRING,
                principalid: STRING,
                arn: STRING,
                accountid: STRING,
                username: STRING>,
            ec2roledelivery:string,
            webidfederationdata: STRUCT<
                federatedprovider: STRING,
                attributes: map<string,string>>
        >
    >,
    eventtime STRING,
    eventsource STRING,
    eventname STRING,
    awsregion STRING,
    sourceipaddress STRING,
    useragent STRING,
    errorcode STRING,
    errormessage STRING,
    requestparameters STRING,
    responseelements STRING,
    additionaleventdata STRING,
    requestid STRING,
    eventid STRING,
    readonly STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountid: STRING,
        type: STRING>>,
    eventtype STRING,
    apiversion STRING,
    recipientaccountid STRING,
    serviceeventdetails STRING,
    sharedeventid STRING,
    vpcendpointid STRING,
    vpcendpointaccountid STRING,
    eventcategory STRING,
    addendum STRUCT<
      reason:STRING,
      updatedfields:STRING,
      originalrequestid:STRING,
      originaleventid:STRING>,
    sessioncredentialfromconsole STRING,
    edgedevicedetails STRING,
    tlsdetails STRUCT<
      tlsversion:STRING,
      ciphersuite:STRING,
      clientprovidedhostheader:STRING>
  )
PARTITIONED BY (
   `timestamp` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/account-id/CloudTrail/aws-region'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.timestamp.format'='yyyy/MM/dd', 
  'projection.timestamp.interval'='1', 
  'projection.timestamp.interval.unit'='DAYS', 
  'projection.timestamp.range'='2020/01/01,NOW', 
  'projection.timestamp.type'='date', 
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')
```

Weitere Informationen zur Partitionsprojektion finden Sie unter [Partitionsprojektion mit Amazon Athena verwenden](partition-projection.md).

# Beispiel für CloudTrail Protokollabfragen
<a name="query-examples-cloudtrail-logs"></a>

Das folgende Beispiel zeigt einen Teil einer Abfrage, die alle anonymen (unsignierten) Anfragen aus der Tabelle zurückgibt, die für CloudTrail Ereignisprotokolle erstellt wurde. Diese Abfrage wählt die Anforderungen aus, in denen `useridentity.accountid` anonym ist und `useridentity.arn` nicht angegeben wird:

```
SELECT *
FROM cloudtrail_logs
WHERE 
    eventsource = 's3.amazonaws.com' AND 
    eventname in ('GetObject') AND 
    useridentity.accountid = 'anonymous' AND 
    useridentity.arn IS NULL AND
    requestparameters LIKE '%[your bucket name ]%';
```

Weitere Informationen finden Sie im AWS Big-Data-Blogbeitrag [Analysieren Sie Sicherheit, Compliance und betriebliche Aktivitäten mithilfe von AWS CloudTrail Amazon Athena](https://aws.amazon.com/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/).

## Fragen Sie verschachtelte Felder in Protokollen ab CloudTrail
<a name="cloudtrail-logs-nested-fields"></a>

Da die `userIdentity`- und `resources`-Felder verschachtelte Datentypen sind, erfordert ihre Abfrage eine besondere Behandlung.

Das `userIdentity`-Objekt besteht aus verschachtelten `STRUCT`-Typen. Diese können mithilfe eines Punkts abgefragt werden, um die Felder wie im folgenden Beispiel zu trennen:

```
SELECT 
    eventsource, 
    eventname,
    useridentity.sessioncontext.attributes.creationdate,
    useridentity.sessioncontext.sessionissuer.arn
FROM cloudtrail_logs
WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL
ORDER BY eventsource, eventname
LIMIT 10
```

Das `resources`-Feld ist ein Array von `STRUCT`-Objekten. Verwenden Sie für diese Arrays `CROSS JOIN UNNEST`, um die Verschachtelung des Arrays aufzuheben, damit Sie seine Objekte abfragen können.

Im folgenden Beispiel werden alle Zeilen zurückgegeben, in denen der Ressourcen-ARN auf `example/datafile.txt` endet. Zur besseren Lesbarkeit entfernt die [Ersetzung](https://prestodb.io/docs/current/functions/string.html#replace)sfunktion die anfängliche `arn:aws:s3:::`-Teilzeichenfolge aus dem ARN.

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource,
    eventname,
    eventtime,
    useragent
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt'
ORDER BY eventtime
```

Es folgen Beispiele der Ereignisse für `DeleteBucket`-Ereignisse. Die Abfrage extrahiert den Namen des Buckets und die Konto-ID, zu der der Bucket gehört, aus dem `resources`-Objekt.

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket,
    eventtime AS time_deleted,
    useridentity.username, 
    unnested.resources_entry.accountid as bucket_acct_id 
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE eventname = 'DeleteBucket'
ORDER BY eventtime
```

Weitere Informationen zum Aufheben der Verschachtelung finden Sie unter [Filtern von Arrays](filtering-arrays.md).

## Tipps zum Abfragen von Protokollen CloudTrail
<a name="tips-for-querying-cloudtrail-logs"></a>

Beachten Sie bei der Untersuchung von CloudTrail Protokolldaten Folgendes:
+ Bevor Sie Abfragen für Protokolle ausführen, sollten Sie sicherstellen, dass Ihre Protokolltabelle ebenso aussieht wie die unter [Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung](create-cloudtrail-table.md). Falls dies nicht die erste Tabelle ist, löschen Sie die vorhandene Tabelle mit folgendem Befehl: `DROP TABLE cloudtrail_logs`.
+ Nachdem Sie die vorhandene Tabelle gelöscht haben, erstellen Sie diese neu. Weitere Informationen finden Sie unter [Erstellen Sie eine Tabelle für CloudTrail Logs in Athena mit manueller Partitionierung](create-cloudtrail-table.md).

  Überprüfen Sie, ob die Felder in der Athena-Abfrage korrekt aufgeführt werden. Informationen zur vollständigen Liste der Felder in einem CloudTrail Datensatz finden Sie unter [CloudTrail Datensatzinhalt](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html). 

  Falls die Abfrage Felder in JSON-Formaten enthält (z. B. `STRUCT`), extrahieren Sie die Daten aus JSON. Weitere Informationen finden Sie unter [Extrahieren Sie JSON-Daten aus Zeichenfolgen](extracting-data-from-JSON.md). 

  Einige Vorschläge für das Ausgeben von Abfragen für Ihre CloudTrail Tabelle:
+ Sehen Sie sich zunächst an, welche -Benutzer welche API-Operationen über welche Quell-IP-Adressen aufgerufen haben.
+ Verwenden Sie die folgende SQL-Basisabfrage als Vorlage. Fügen Sie die Abfrage in die Athena-Konsole ein und führen Sie sie aus.

  ```
  SELECT
   useridentity.arn,
   eventname,
   sourceipaddress,
   eventtime
  FROM cloudtrail_logs
  LIMIT 100;
  ```
+ Ändern Sie die Abfrage, um Ihre Daten weiter zu untersuchen.
+ Um die Leistung zu verbessern, binden Sie die Klausel `LIMIT` ein, damit ein bestimmtes Subset von Zeilen zurückgegeben wird.

# Abfragen von Amazon-EMR-Protokollen
<a name="emr-logs"></a>

Amazon EMR und Big-Data-Anwendungen, die auf von Amazon EMR erzeugten Protokolldateien ausgeführt werden. Protokolldateien werden auf den [Primärknoten](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html) geschrieben, und Sie können Amazon EMR zudem so konfigurieren, dass Protokolldateien automatisch in Amazon S3 archiviert werden. Sie können mit Amazon Athena diese Protokolle abfragen, um Ereignisse und Trends für Anwendungen und Cluster zu identifizieren. Weitere Informationen zu den Arten von Protokolldateien in Amazon EMR und deren Speicherung in Amazon S3 finden Sie unter [Anzeigen von Protokolldateien](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html) im *Amazon-EMR-Verwaltungshandbuch*.

**Topics**
+ [Erstellen und Abfragen einer Basistabelle basierend auf Amazon-EMR-Protokolldateien](emr-create-table.md)
+ [Erstellen und Abfragen einer partitionierten Tabelle basierend auf Amazon-EMR-Protokollen](emr-create-table-partitioned.md)

# Erstellen und Abfragen einer Basistabelle basierend auf Amazon-EMR-Protokolldateien
<a name="emr-create-table"></a>

Im folgenden Beispiel wird die Basistabelle `myemrlogs` erstellt, die auf Protokolldateien basiert, die in `s3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/elasticmapreduce/` gespeichert sind. Der in den folgenden Beispielen verwendete Amazon S3 S3-Speicherort entspricht dem Muster des Standard-Protokollspeicherorts für einen EMR-Cluster, der vom Amazon Web Services Services-Konto *123456789012* in Region *us-west-2* erstellt wurde. Wenn Sie einen benutzerdefinierten Speicherort verwenden, lautet das Muster s3://amzn-s3-demo-bucket/*ClusterID*.

Hinweise zum Erstellen einer partitionierten Tabelle zur potenziellen Verbesserung der Abfrageleistung und zur Verringerung der Datenübertragung finden Sie unter [Erstellen und Abfragen einer partitionierten Tabelle basierend auf Amazon-EMR-Protokollen](emr-create-table-partitioned.md).

```
CREATE EXTERNAL TABLE `myemrlogs`(
  `data` string COMMENT 'from deserializer')
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

## Beispielabfragen
<a name="emr-example-queries-basic"></a>

Die folgenden Beispielabfragen können für die im vorherigen Beispiel erstellte `myemrlogs`-Tabelle ausgeführt werden.

**Example – Abfrage von step-Protokollen nach Vorkommen von ERROR, WARN, INFO, EXCEPTION, FATAL oder DEBUG**  

```
SELECT data,
        "$PATH"
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'s-86URH188Z6B1')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – Abfrage eines bestimmten Instance-Protokolls, i-00b3c0a839ece0a9c, nach ERROR, WARN, INFO, EXCEPTION, FATAL oder DEBUG**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'i-00b3c0a839ece0a9c')
        AND regexp_like("$PATH",'state')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – Abfrage von presto-Anwendungsprotokollen nach ERROR, WARN, INFO, EXCEPTION, FATAL oder DEBUG**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'presto')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – Abfrage von Namenode-Anwendungsprotokollen nach ERROR, WARN, INFO, EXCEPTION, FATAL oder DEBUG**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'namenode')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – Abfrage aller Protokolle nach Datum und Stunde für ERROR, WARN, INFO, EXCEPTION, FATAL oder DEBUG**  

```
SELECT distinct("$PATH") AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'2019-07-23-10')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

# Erstellen und Abfragen einer partitionierten Tabelle basierend auf Amazon-EMR-Protokollen
<a name="emr-create-table-partitioned"></a>

Diese Beispiele verwenden denselben Protokollspeicherort zum Erstellen einer Athena-Tabelle, die Tabelle wird aber partitioniert, und dann wird für jeden Protokollspeicherort eine Partition erstellt. Weitere Informationen finden Sie unter [Ihre Daten partitionieren](partitions.md).

Die folgende Abfrage erstellt die partitionierte Tabelle mit dem Namen `mypartitionedemrlogs`:

```
CREATE EXTERNAL TABLE `mypartitionedemrlogs`(
  `data` string COMMENT 'from deserializer')
 partitioned by (logtype string)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

Die folgenden Abfrageanweisungen erstellen dann Tabellenpartitionen basierend auf Unterverzeichnissen für verschiedene Protokolltypen, die Amazon EMR in Amazon S3 erstellt:

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='containers')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/containers/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-mapreduce')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-mapreduce/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-state-pusher')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-state-pusher/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='node')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/node/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='steps')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/steps/'
```

Nachdem Sie die Partitionen erstellt haben, können Sie eine `SHOW PARTITIONS`-Abfrage in der Tabelle ausführen, um Folgendes zu bestätigen:

```
SHOW PARTITIONS mypartitionedemrlogs;
```

## Beispielabfragen
<a name="emr-example-queries-partitioned"></a>

In den folgenden Beispielen werden Abfragen für bestimmte Protokolleinträge veranschaulicht, die die anhand der obigen Beispiele erstellten Tabelle und Partitionen verwenden.

**Example – Abfrage der Protokolle von Anwendung application\$11561661818238\$10002 in der Container-Partition nach ERROR oder WARN**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='containers'
        AND regexp_like("$PATH",'application_1561661818238_0002')
        AND regexp_like(data, 'ERROR|WARN') limit 100;
```

**Example – Abfrage der hadoop-Mapreduce-Partition nach Auftrag job\$11561661818238\$10004 und fehlgeschlagene Reduzierungen**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='hadoop-mapreduce'
        AND regexp_like(data,'job_1561661818238_0004|Failed Reduces') limit 100;
```

**Example – Abfrage von Hive-Protokollen in der Knotenpartition nach Abfrage-ID 056e0609-33e1-4611-956c-7a31b42d2663**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like("$PATH",'hive')
        AND regexp_like(data,'056e0609-33e1-4611-956c-7a31b42d2663') limit 100;
```

**Example – Abfrage von resourcemanager-Protokollen in der Knotenpartition für die Anwendung 1567660019320\$10001\$101\$1000001**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like(data,'resourcemanager')
        AND regexp_like(data,'1567660019320_0001_01_000001') limit 100
```

# AWS Global Accelerator Flow-Logs abfragen
<a name="querying-global-accelerator-flow-logs"></a>

Sie können AWS Global Accelerator damit Beschleuniger erstellen, die den Netzwerkverkehr über das globale Netzwerk an optimale Endpunkte weiterleiten. AWS Weitere Informationen zu Global Accelerator finden Sie unter [Was ist](https://docs.aws.amazon.com/global-accelerator/latest/dg/what-is-global-accelerator.html). AWS Global Accelerator

Mit Global-Accelerator-Flow-Protokollen können Sie Informationen zum Datenverkehr über die IP-Adresse zu und von Netzwerkschnittstellen in Ihren Accelerators erfassen. Flow-Protokolldaten werden in Amazon S3 veröffentlicht, wo Sie Ihre Daten abrufen und anzeigen können. Weitere Informationen finden Sie unter [Flow-Protokolle in AWS Global Accelerator](https://docs.aws.amazon.com/global-accelerator/latest/dg/monitoring-global-accelerator.flow-logs.html).

Sie können Athena verwenden, um Ihre Global-Accelerator-Flow-Protokolle abzufragen, indem Sie eine Tabelle erstellen, die ihren Speicherort in Amazon S3 angibt.

**So erstellen Sie die Tabelle für Global-Accelerator-Flow-Protokolle**

1. Kopieren Sie die folgende DDL-Anweisung in die Athena-Konsole. Diese Abfrage gibt *ROW FORMAT DELIMITED* an und lässt die Angabe von a aus [SerDe](serde-reference.md), was bedeutet, dass die Abfrage die verwendet. [`LazySimpleSerDe`](lazy-simple-serde.md) Bei dieser Abfrage werden Felder durch ein Leerzeichen beendet.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS aga_flow_logs (
     version string,
     account string,
     acceleratorid string,
     clientip string,
     clientport int,
     gip string,
     gipport int,
     endpointip string,
     endpointport int,
     protocol string,
     ipaddresstype string,
     numpackets bigint,
     numbytes int,
     starttime int,
     endtime int,
     action string,
     logstatus string,
     agasourceip string,
     agasourceport int,
     endpointregion string,
     agaregion string,
     direction string,
     vpc_id string,
     reject_reason string
   )
   PARTITIONED BY (dt string)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ' '
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region/'
   TBLPROPERTIES ("skip.header.line.count"="1");
   ```

1. Ändern Sie den `LOCATION`-Wert so, dass auf den Amazon-S3-Bucket verwiesen wird, der Ihre Protokolldaten enthält.

   ```
   's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region_code/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage wird die Tabelle `aga_flow_logs` von Athena registriert, so dass Sie die darin enthaltenen Daten für Abfragen nutzen können.

1. Erstellen Sie Partitionen zum Lesen der Daten, wie in der folgenden Beispielabfrage. Diese Abfrage erstellt eine einfache Partition für ein angegebenes Datum. Ersetzen Sie die Platzhalter für Datum und Standort.

   ```
   ALTER TABLE aga_flow_logs
   ADD PARTITION (dt='YYYY-MM-dd')
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region_code/YYYY/MM/dd';
   ```

## Beispielabfragen für Flow-Logs AWS Global Accelerator
<a name="querying-global-accelerator-flow-logs-examples"></a>

**Example – Liste der Anforderungen, die eine bestimmte Edge-Position durchlaufen**  
In der folgenden Beispielabfrage werden Anforderungen aufgeführt, die durch die LHR-Edgeposition übergeben wurden. Mit dem Operator `LIMIT` lässt sich die Anzahl der im gleichen Schritt abzufragenden Protokolle einschränken.  

```
SELECT 
  clientip, 
  agaregion, 
  protocol, 
  action 
FROM 
  aga_flow_logs 
WHERE 
  agaregion LIKE 'LHR%' 
LIMIT 
  100;
```

**Example – Liste der Endpunkt-IP-Adressen, die die meisten HTTPS-Anforderungen empfangen**  
Verwenden Sie die folgende Abfrage, um zu sehen, welche Endpunkt-IP-Adressen die höchste Anzahl von HTTPS-Anforderungen empfangen. Diese Abfrage zählt die Anzahl der vom HTTPS-Port 443 empfangenen Pakete, gruppiert sie nach IP-Zieladresse und gibt die Top 10 IP-Adressen aus.  

```
SELECT 
  SUM(numpackets) AS packetcount, 
  endpointip 
FROM 
  aga_flow_logs 
WHERE 
  endpointport = 443 
GROUP BY 
  endpointip 
ORDER BY 
  packetcount DESC 
LIMIT 
  10;
```

# GuardDuty Amazon-Ergebnisse abfragen
<a name="querying-guardduty"></a>

[Amazon GuardDuty](https://aws.amazon.com/guardduty/) ist ein Sicherheitsüberwachungsservice, der Ihnen hilft, unerwartete und potenziell nicht autorisierte oder böswillige Aktivitäten in Ihrer AWS Umgebung zu identifizieren. Wenn es unerwartete und potenziell bösartige Aktivitäten erkennt, GuardDuty generiert es [Sicherheitsergebnisse](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings.html), die Sie zur Speicherung und Analyse nach Amazon S3 exportieren können. Nachdem Sie Ihre Ergebnisse in Amazon S3 exportiert haben, können Sie diese mit Athena abfragen. Dieser Artikel zeigt, wie Sie in Athena eine Tabelle für Ihre GuardDuty Ergebnisse erstellen und diese abfragen.

Weitere Informationen zu Amazon GuardDuty finden Sie im [ GuardDuty Amazon-Benutzerhandbuch](https://docs.aws.amazon.com/guardduty/latest/ug/).

## Voraussetzungen
<a name="querying-guardduty-prerequisites"></a>
+ Aktivieren Sie die GuardDuty Funktion zum Exportieren von Ergebnissen nach Amazon S3. Eine Anleitung dazu finden Sie unter [Ergebnisse exportieren](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html) im GuardDuty Amazon-Benutzerhandbuch.

## Erstellen Sie in Athena eine Tabelle für Ergebnisse GuardDuty
<a name="querying-guardduty-creating-a-table-in-athena-for-guardduty-findings"></a>

Um Ihre GuardDuty Ergebnisse von Athena abzufragen, müssen Sie eine Tabelle für sie erstellen.

**Um in Athena eine Tabelle für GuardDuty Ergebnisse zu erstellen**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Fügen Sie die folgende DDL-Anweisung in die Athena-Konsole ein. Ändern Sie die Werte so`LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/'`, dass sie auf Ihre GuardDuty Ergebnisse in Amazon S3 verweisen.

   ```
   CREATE EXTERNAL TABLE `gd_logs` (
     `schemaversion` string,
     `accountid` string,
     `region` string,
     `partition` string,
     `id` string,
     `arn` string,
     `type` string,
     `resource` string,
     `service` string,
     `severity` string,
     `createdat` string,
     `updatedat` string,
     `title` string,
     `description` string)
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/'
    TBLPROPERTIES ('has_encrypted_data'='true')
   ```
**Anmerkung**  
Das SerDe erwartet, dass sich jedes JSON-Dokument in einer einzigen Textzeile ohne Zeilenabschlusszeichen befindet, die die Felder im Datensatz trennen. Wenn der JSON-Text ein hübsches Druckformat hat, erhalten Sie möglicherweise eine Fehlermeldung wie HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object oder HIVE\$1CURSOR\$1ERROR:: Unerwartet JsonParseException end-of-input: erwarteter Schließpunkt für OBJECT, wenn Sie versuchen, die Tabelle nach ihrer Erstellung abzufragen. Weitere Informationen finden Sie unter [JSON-Datendateien](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) in der SerDe OpenX-Dokumentation unter GitHub. 

1. Führen Sie die Abfrage in der Athena-Konsole aus, um die `gd_logs`-Tabelle zu registrieren. Wenn die Abfrage abgeschlossen ist, können Sie die Ergebnisse aus Athena abfragen.

## Beispielabfragen
<a name="querying-guardduty-examples"></a>

Die folgenden Beispiele zeigen, wie GuardDuty Ergebnisse von Athena abgefragt werden.

**Example – DNS-Datenexfiltration**  
Die folgende Abfrage gibt Informationen über EC2 Amazon-Instances zurück, die möglicherweise Daten über DNS-Abfragen exfiltrieren.  

```
SELECT
    title,
    severity,
    type,
    id AS FindingID,
    accountid,
    region,
    createdat,
    updatedat,
    json_extract_scalar(service, '$.count') AS Count,
    json_extract_scalar(resource, '$.instancedetails.instanceid') AS InstanceID,
    json_extract_scalar(service, '$.action.actiontype') AS DNS_ActionType,
    json_extract_scalar(service, '$.action.dnsrequestaction.domain') AS DomainName,
    json_extract_scalar(service, '$.action.dnsrequestaction.protocol') AS protocol,
    json_extract_scalar(service, '$.action.dnsrequestaction.blocked') AS blocked
FROM gd_logs
WHERE type = 'Trojan:EC2/DNSDataExfiltration'
ORDER BY severity DESC
```

**Example – Unberechtigter IAM-Benutzerzugriff**  
Die folgende Abfrage gibt alle `UnauthorizedAccess:IAMUser`-Suchtypen für einen IAM-Prinzipal aus allen Regionen zurück.   

```
SELECT title,
         severity,
         type,
         id,
         accountid,
         region,
         createdat,
         updatedat,
         json_extract_scalar(service, '$.count') AS Count, 
         json_extract_scalar(resource, '$.accesskeydetails.username') AS IAMPrincipal, 
         json_extract_scalar(service,'$.action.awsapicallaction.api') AS APIActionCalled
FROM gd_logs
WHERE type LIKE '%UnauthorizedAccess:IAMUser%' 
ORDER BY severity desc;
```

## Tipps für die Abfrage von Ergebnissen GuardDuty
<a name="querying-guardduty-tips"></a>

Beachten Sie beim Erstellen der Abfrage die folgenden Punkte.
+ Um Daten aus verschachtelten JSON-Feldern zu extrahieren, verwenden Sie die `json_extract`- oder `json_extract_scalar`-Funktionen von Presto. Weitere Informationen finden Sie unter [Extrahieren Sie JSON-Daten aus Zeichenfolgen](extracting-data-from-JSON.md).
+ Stellen Sie sicher, dass alle Zeichen in den JSON-Feldern Kleinbuchstaben sind.
+  Hinweise zum Herunterladen von Abfrageergebnissen finden Sie unter [Herunterladen von Abfrageergebnisdateien mithilfe der Athena-Konsole](saving-query-results.md).

# AWS Network Firewall Logs abfragen
<a name="querying-network-firewall-logs"></a>

AWS Network Firewall ist ein verwalteter Service, mit dem Sie wichtige Netzwerkschutzmaßnahmen für Ihre Amazon Virtual Private Cloud Cloud-Instances bereitstellen können. AWS Network Firewall arbeitet zusammen mit, AWS Firewall Manager sodass Sie Richtlinien auf der Grundlage von AWS Network Firewall Regeln erstellen und diese Richtlinien dann zentral auf Ihre VPCs Konten anwenden können. Weitere Informationen zu finden AWS Network Firewall Sie unter [AWS Network Firewall](https://aws.amazon.com/network-firewall/).

Sie können die AWS Network Firewall Protokollierung für den Datenverkehr konfigurieren, den Sie an die Stateful-Regel-Engine Ihrer Firewall weiterleiten. Mit der Protokollierung erhalten Sie detaillierte Informationen zum Netzwerkverkehr, einschließlich der Zeit, zu der die Stateful-Engine ein Paket empfangen hat, detaillierte Informationen über das Paket und alle Stateful-Regelaktionen, die gegen das Paket ausgeführt werden. Die Protokolle werden in dem von Ihnen konfigurierten Protokollziel veröffentlicht, wo Sie sie abrufen und anzeigen können. Weitere Informationen finden Sie unter [Protokollieren des Netzwerkverkehrs von AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html) im *AWS Network Firewall -Entwicklerhandbuch*.

**Topics**
+ [Eine Tabelle für Warnungsprotokolle erstellen und abfragen](querying-network-firewall-logs-sample-alert-logs-table.md)
+ [Eine Tabelle für Netzwerkfluss-Protokolle erstellen und abfragen](querying-network-firewall-logs-sample-netflow-logs-table.md)

# Eine Tabelle für Warnungsprotokolle erstellen und abfragen
<a name="querying-network-firewall-logs-sample-alert-logs-table"></a>

1. Ändern Sie die folgende DDL-Beispielanweisung so, dass sie der Struktur Ihres Warnungsprotokolls entspricht. Möglicherweise müssen Sie die Anweisung so aktualisieren, dass sie die Spalten für die neueste Version der Protokolle enthält. Weitere Informationen finden Sie unter [Inhalt eines Firewall-Protokolls](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html#firewall-logging-contents) im *AWS Network Firewall -Entwicklerhandbuch*.

   ```
   CREATE EXTERNAL TABLE network_firewall_alert_logs (
     firewall_name string,
     availability_zone string,
     event_timestamp string,
     event struct<
       timestamp:string,
       flow_id:bigint,
       event_type:string,
       src_ip:string,
       src_port:int,
       dest_ip:string,
       dest_port:int,
       proto:string,
       app_proto:string,
       sni:string,
       tls_inspected:boolean,
       tls_error:struct<
         error_message:string>,
       revocation_check:struct<
         leaf_cert_fpr:string,
         status:string,
         action:string>,
       alert:struct<
         alert_id:string,
         alert_type:string,
         action:string,
         signature_id:int,
         rev:int,
         signature:string,
         category:string,
         severity:int,
         rule_name:string,
         alert_name:string,
         alert_severity:string,
         alert_description:string,
         file_name:string,
         file_hash:string,
         packet_capture:string,
         reference_links:array<string>
       >, 
       src_country:string, 
       dest_country:string, 
       src_hostname:string, 
       dest_hostname:string, 
       user_agent:string, 
       url:string
      >
   )
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 's3://amzn-s3-demo-bucket/path_to_alert_logs_folder/';
   ```

1. Ändern Sie die `LOCATION`-Klausel, um den Ordner für Ihre Protokolle in Amazon S3 anzugeben.

1. Führen Sie Ihre `CREATE TABLE`-Abfrage im Athena-Abfragen-Editor aus. Nach Abschluss der Abfrage registriert Athena die `network_firewall_alert_logs`-Tabelle, sodass die Daten, auf die sie verweist, für Abfragen bereitstehen.

## Beispielabfrage
<a name="querying-network-firewall-logs-alert-log-sample-query"></a>

Die Beispielabfrage für das Warnungsprotokoll in diesem Abschnitt filtert nach Ereignissen, bei denen eine TLS-Prüfung durchgeführt wurde und die Warnungen mit einem Schweregrad von 2 oder höher aufweisen.

Die Abfrage verwendet Aliase, um Ausgabespaltenüberschriften zu erstellen, die das `struct` anzeigen, zu dem die Spalte gehört. Beispielsweise lautet die Spaltenüberschrift für das `event.alert.category`-Feld `event_alert_category` statt nur `category`. Um die Spaltennamen weiter anzupassen, können Sie die Aliase an Ihre Präferenzen anpassen. Sie können beispielsweise Unterstriche oder andere Trennzeichen verwenden, um die `struct`-Namen und Feldnamen abzugrenzen. 

Denken Sie daran, Spaltennamen und `struct`-Verweise auf der Grundlage Ihrer Tabellendefinition und der Felder, die Sie im Abfrageergebnis haben möchten, zu ändern.

```
SELECT 
  firewall_name,
  availability_zone,
  event_timestamp,
  event.timestamp AS event_timestamp,
  event.flow_id AS event_flow_id,
  event.event_type AS event_type,
  event.src_ip AS event_src_ip,
  event.src_port AS event_src_port,
  event.dest_ip AS event_dest_ip,
  event.dest_port AS event_dest_port,
  event.proto AS event_protol,
  event.app_proto AS event_app_proto,
  event.sni AS event_sni,
  event.tls_inspected AS event_tls_inspected,
  event.tls_error.error_message AS event_tls_error_message,
  event.revocation_check.leaf_cert_fpr AS event_revocation_leaf_cert,
  event.revocation_check.status AS event_revocation_check_status,
  event.revocation_check.action AS event_revocation_check_action,
  event.alert.alert_id AS event_alert_alert_id,
  event.alert.alert_type AS event_alert_alert_type,
  event.alert.action AS event_alert_action,
  event.alert.signature_id AS event_alert_signature_id,
  event.alert.rev AS event_alert_rev,
  event.alert.signature AS event_alert_signature,
  event.alert.category AS event_alert_category,
  event.alert.severity AS event_alert_severity,
  event.alert.rule_name AS event_alert_rule_name,
  event.alert.alert_name AS event_alert_alert_name,
  event.alert.alert_severity AS event_alert_alert_severity,
  event.alert.alert_description AS event_alert_alert_description,
  event.alert.file_name AS event_alert_file_name,
  event.alert.file_hash AS event_alert_file_hash,
  event.alert.packet_capture AS event_alert_packet_capture,
  event.alert.reference_links AS event_alert_reference_links,
  event.src_country AS event_src_country,
  event.dest_country AS event_dest_country,
  event.src_hostname AS event_src_hostname,
  event.dest_hostname AS event_dest_hostname,
  event.user_agent AS event_user_agent,
  event.url AS event_url
FROM 
  network_firewall_alert_logs 
WHERE 
  event.alert.severity >= 2
  AND event.tls_inspected = true 
LIMIT 10;
```

# Eine Tabelle für Netzwerkfluss-Protokolle erstellen und abfragen
<a name="querying-network-firewall-logs-sample-netflow-logs-table"></a>

1. Ändern Sie die folgende DDL-Beispielanweisung so, dass sie der Struktur Ihrer Netzwerkfluss-Protokolle entspricht. Möglicherweise müssen Sie die Anweisung so aktualisieren, dass sie die Spalten für die neueste Version der Protokolle enthält. Weitere Informationen finden Sie unter [Inhalt eines Firewall-Protokolls](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html#firewall-logging-contents) im *AWS Network Firewall -Entwicklerhandbuch*.

   ```
   CREATE EXTERNAL TABLE network_firewall_netflow_logs (
     firewall_name string,
     availability_zone string,
     event_timestamp string,
     event struct<
       timestamp:string,
       flow_id:bigint,
       event_type:string,
       src_ip:string,
       src_port:int,
       dest_ip:string,
       dest_port:int,
       proto:string,
       app_proto:string,
       tls_inspected:boolean,
       netflow:struct<
         pkts:int,
         bytes:bigint,
         start:string,
         `end`:string,
         age:int,
         min_ttl:int,
         max_ttl:int,
         tcp_flags:struct<
           syn:boolean,
           fin:boolean,
           rst:boolean,
           psh:boolean,
           ack:boolean,
           urg:boolean
           >
         >
       >
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
   LOCATION 's3://amzn-s3-demo-bucket/path_to_netflow_logs_folder/';
   ```

1. Ändern Sie die `LOCATION`-Klausel, um den Ordner für Ihre Protokolle in Amazon S3 anzugeben.

1. Führen Sie die `CREATE TABLE`-Abfrage im Athena-Abfrage-Editor aus. Nach Abschluss der Abfrage registriert Athena die `network_firewall_netflow_logs`-Tabelle, sodass die Daten, auf die sie verweist, für Abfragen bereitstehen.

## Beispielabfrage
<a name="querying-network-firewall-logs-netflow-log-sample-query"></a>

Das Beispiel für eine Netzwerkfluss-Protokollabfrage in diesem Abschnitt filtert nach Ereignissen, bei denen eine TLS-Überprüfung durchgeführt wurde.

Die Abfrage verwendet Aliase, um Ausgabespaltenüberschriften zu erstellen, die das `struct` anzeigen, zu dem die Spalte gehört. Beispielsweise lautet die Spaltenüberschrift für das `event.netflow.bytes`-Feld `event_netflow_bytes` statt nur `bytes`. Um die Spaltennamen weiter anzupassen, können Sie die Aliase an Ihre Präferenzen anpassen. Sie können beispielsweise Unterstriche oder andere Trennzeichen verwenden, um die `struct`-Namen und Feldnamen abzugrenzen. 

Denken Sie daran, Spaltennamen und `struct`-Verweise auf der Grundlage Ihrer Tabellendefinition und der Felder, die Sie im Abfrageergebnis haben möchten, zu ändern.

```
SELECT
  event.src_ip AS event_src_ip,
  event.dest_ip AS event_dest_ip,
  event.proto AS event_proto,
  event.app_proto AS event_app_proto,
  event.tls_inspected AS event_tls_inspected,
  event.netflow.pkts AS event_netflow_pkts,
  event.netflow.bytes AS event_netflow_bytes,
  event.netflow.tcp_flags.syn AS event_netflow_tcp_flags_syn 
FROM network_firewall_netflow_logs 
WHERE event.tls_inspected = true
```

# Abfragen von Network-Load-Balancer-Protokollen
<a name="networkloadbalancer-classic-logs"></a>

Verwenden Sie Athena, um Protokolle aus dem Network Load Balancer zu analysieren und zu verarbeiten. Diese Protokolle erhalten detaillierte Informationen über die Transport-Layer-Security(TLS)-Anfragen, die an Network Load Balancer gesendet werden. Sie können diese Zugriffsprotokolle für die Analyse von Datenverkehrsmustern und zur Problembehebung verwenden. 

Bevor Sie die Network-Load-Balancer-Zugriffsprotokolle analysieren, aktivieren und konfigurieren Sie sie für die Speicherung im Amazon-S3-Ziel-Bucket. Weitere Informationen und Informationen zu den einzelnen Network-Load-Balancer-Zugriffsprotokolleinträgen finden Sie unter [Zugriffsprotokolle für Ihren Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html).

**Erstellen der Tabelle für die Protokolle des Network Load Balancers**

1. Kopieren Sie die folgende DDL-Anweisung in die Athena-Konsole. Überprüfen Sie die [Syntax](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html#access-log-file-format) der Protokolleinträge des Network Load Balancer. Aktualisieren Sie die Anweisung nach Bedarf, sodass sie die Spalten und Regex enthält, die Ihren Protokolldatensätzen entsprechen.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS nlb_tls_logs (
               type string,
               version string,
               time string,
               elb string,
               listener_id string,
               client_ip string,
               client_port int,
               target_ip string,
               target_port int,
               tcp_connection_time_ms double,
               tls_handshake_time_ms double,
               received_bytes bigint,
               sent_bytes bigint,
               incoming_tls_alert int,
               cert_arn string,
               certificate_serial string,
               tls_cipher_suite string,
               tls_protocol_version string,
               tls_named_group string,
               domain_name string,
               alpn_fe_protocol string,
               alpn_be_protocol string,
               alpn_client_preference_list string,
               tls_connection_creation_time string
               )
               ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
               WITH SERDEPROPERTIES (
               'serialization.format' = '1',
               'input.regex' = 
               '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-0-9]*) ([-0-9]*) ([-0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
               )
               LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_account_ID/elasticloadbalancing/region';
   ```

1. Ändern Sie den `LOCATION`-Amazon-S3-Bucket, um das Ziel Ihrer Network-Load-Balancer-Protokolle anzugeben.

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage wird die Tabelle `nlb_tls_logs` von Athena registriert, sodass Sie die darin enthaltenen Daten für Abfragen nutzen können.

## Beispielabfragen
<a name="query-nlb-example"></a>

Wenn Sie wissen möchten, wie oft ein Zertifikat verwendet wird, verwenden Sie eine Abfrage ähnlich wie in diesem Beispiel:

```
SELECT count(*) AS 
         ct,
         cert_arn
FROM "nlb_tls_logs"
GROUP BY  cert_arn;
```

Die folgende Abfrage zeigt, wie viele Benutzer eine TLS-Version vor 1.3 verwenden:

```
SELECT tls_protocol_version,
         COUNT(tls_protocol_version) AS 
         num_connections,
         client_ip
FROM "nlb_tls_logs"
WHERE tls_protocol_version < 'tlsv13'
GROUP BY tls_protocol_version, client_ip;
```

Verwenden Sie die folgende Abfrage, um Verbindungen zu identifizieren, die eine lange TLS-Handshake-Zeit benötigen:

```
SELECT *
FROM "nlb_tls_logs"
ORDER BY  tls_handshake_time_ms DESC 
LIMIT 10;
```

Verwenden Sie die folgende Abfrage, um zu ermitteln und zu zählen, welche TLS-Protokollversionen und Verschlüsselungssammlungen in den letzten 30 Tagen ausgehandelt wurden.

```
SELECT tls_cipher_suite,
         tls_protocol_version,
         COUNT(*) AS ct
FROM "nlb_tls_logs"
WHERE from_iso8601_timestamp(time) > current_timestamp - interval '30' day
        AND NOT tls_protocol_version = '-'
GROUP BY tls_cipher_suite, tls_protocol_version
ORDER BY ct DESC;
```

# Abfrageprotokolle für Amazon Route 53 Resolver abfragen
<a name="querying-r53-resolver-logs"></a>

Sie können Athena-Tabellen für Ihre Amazon-Route-53-Resolver-Abfrageprotokolle erstellen und von Athena abfragen.

Die Route-53-Resolver-Abfrageprotokollierung dient zum Protokollieren von DNS-Abfragen, die von Ressourcen innerhalb einer VPC, On-Premises-Ressourcen, die eingehende Resolver-Endpunkte verwenden, Abfragen, die einen ausgehenden Resolver-Endpunkt für die rekursive DNS-Auflösung verwenden, und Abfragen, die Route-53-Resolver-DNS-Firewallregeln verwenden um eine Domainliste zu blockieren, zuzulassen oder zu überwachen. Weitere Informationen zur Resolver-Abfrageprotokollierung finden Sie unter [Resolver-Abfrageprotokollierung](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs.html) im *Entwicklerhandbuch für Amazon Route 53*. Informationen zu den einzelnen Feldern in den Protokollen finden Sie unter [Werte, die in Resolver-Abfrageprotokollen angezeigt werden](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs-format.html) im *Entwicklerhandbuch zu Amazon Route 53*.

**Topics**
+ [Erstellen der Tabelle für Resolver-Abfrageprotokolle](querying-r53-resolver-logs-creating-the-table.md)
+ [Partitionsprojektion verwenden](querying-r53-resolver-logs-partitioning-example.md)
+ [Beispielabfragen](querying-r53-resolver-logs-example-queries.md)

# Erstellen der Tabelle für Resolver-Abfrageprotokolle
<a name="querying-r53-resolver-logs-creating-the-table"></a>

Sie können den Abfrage-Editor in der Athena-Konsole verwenden, um eine Tabelle für Ihre Route-53-Resolver-Abfrageprotokolle zu erstellen und abzufragen.

**So erstellen und fragen Sie eine Athena-Tabelle für Route-53-Resolver-Abfrageprotokolle ab**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Geben Sie im Athena-Abrage-Editor folgende `CREATE TABLE`-Anweisung ein. Ersetzen Sie die `LOCATION`-Klauselwerte durch diejenigen, die dem Speicherort Ihrer Resolver-Protokolle in Amazon S3 entsprechen.

   ```
   CREATE EXTERNAL TABLE r53_rlogs (
     version string,
     account_id string,
     region string,
     vpc_id string,
     query_timestamp string,
     query_name string,
     query_type string,
     query_class
       string,
     rcode string,
     answers array<
       struct<
         Rdata: string,
         Type: string,
         Class: string>
       >,
     srcaddr string,
     srcport int,
     transport string,
     srcids struct<
       instance: string,
       resolver_endpoint: string
       >,
     firewall_rule_action string,
     firewall_rule_group_id string,
     firewall_domain_list_id string
    )
        
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/aws_account_id/vpcdnsquerylogs/{vpc-id}/'
   ```

   Da die Resolver-Abfrageprotokolldaten im JSON-Format vorliegen, verwendet die CREATE TABLE-Anweisung eine [ SerDeJSON-Bibliothek](json-serde.md), um die Daten zu analysieren.
**Anmerkung**  
Die SerDe erwartet, dass sich jedes JSON-Dokument in einer einzigen Textzeile befindet, ohne dass die Felder im Datensatz durch Zeilenabschlusszeichen voneinander getrennt werden. Wenn der JSON-Text ein hübsches Druckformat hat, erhalten Sie möglicherweise eine Fehlermeldung wie HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object oder HIVE\$1CURSOR\$1ERROR:: Unerwartet JsonParseException end-of-input: erwarteter Schließpunkt für OBJECT, wenn Sie versuchen, die Tabelle nach ihrer Erstellung abzufragen. Weitere Informationen finden Sie unter [JSON-Datendateien](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) in der SerDe OpenX-Dokumentation unter GitHub. 

1. Wählen Sie **Abfrage ausführen**. Die Anweisung erstellt eine Athena-Tabelle mit dem Namen `r53_rlogs`, deren Spalten jedes der Felder in Ihren Resolver-Protokolldaten darstellen.

1. Führen Sie im Abfrage-Editor der Athena-Konsole die folgende Abfrage aus, um zu überprüfen, ob Ihre Tabelle erstellt wurde.

   ```
   SELECT * FROM "r53_rlogs" LIMIT 10
   ```

# Partitionsprojektion verwenden
<a name="querying-r53-resolver-logs-partitioning-example"></a>

Das folgende Beispiel zeigt eine `CREATE TABLE` Anweisung für Resolver-Abfrageprotokolle, die Partitionsprojektion verwendet und nach VPC und Datum partitioniert ist. Weitere Informationen zur Partitionsprojektion finden Sie unter [Partitionsprojektion mit Amazon Athena verwenden](partition-projection.md).

```
CREATE EXTERNAL TABLE r53_rlogs (
  version string,
  account_id string,
  region string,
  vpc_id string,
  query_timestamp string,
  query_name string,
  query_type string,
  query_class string,
  rcode string,
  answers array<
    struct<
      Rdata: string,
      Type: string,
      Class: string>
    >,
  srcaddr string,
  srcport int,
  transport string,
  srcids struct<
    instance: string,
    resolver_endpoint: string
    >,
  firewall_rule_action string,
  firewall_rule_group_id string,
  firewall_domain_list_id string
)
PARTITIONED BY (
`date` string,
`vpc` string
)
ROW FORMAT SERDE      'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT          'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION              's3://amzn-s3-demo-bucket/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/'
TBLPROPERTIES(
'projection.enabled' = 'true',
'projection.vpc.type' = 'enum',
'projection.vpc.values' = 'vpc-6446ae02',
'projection.date.type' = 'date',
'projection.date.range' = '2023/06/26,NOW',
'projection.date.format' = 'yyyy/MM/dd',
'projection.date.interval' = '1',
'projection.date.interval.unit' = 'DAYS',
'storage.location.template' = 's3://amzn-s3-demo-bucket/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/${vpc}/${date}/'
)
```

# Beispielabfragen
<a name="querying-r53-resolver-logs-example-queries"></a>

Die folgenden Beispiele zeigen einige Abfragen, die Sie von Athena in Ihren Resolver-Abfrageprotokollen ausführen können.

## Beispiel 1 – Abfragen von Protokollen in absteigender Reihenfolge query\$1timestamp
<a name="querying-r53-resolver-logs-example-1-query-logs-in-descending-query_timestamp-order"></a>

Die folgende Abfrage zeigt Protokollergebnisse in absteigender `query_timestamp`-Reihenfolge an.

```
SELECT * FROM "r53_rlogs"
ORDER BY query_timestamp DESC
```

## Beispiel 2 – Abfrage von Protokollen innerhalb der angegebenen Start- und Endzeiten
<a name="querying-r53-resolver-logs-example-2-query-logs-within-specified-start-and-end-times"></a>

Die folgende Abfrage fragt Protokolle zwischen Mitternacht und 8 Uhr am 24. September 2020 ab. Ersetzen Sie die Start- und Endzeiten nach Ihren eigenen Anforderungen.

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode
FROM "r53_rlogs"
WHERE (parse_datetime(query_timestamp,'yyyy-MM-dd''T''HH:mm:ss''Z')
     BETWEEN parse_datetime('2020-09-24-00:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2020-09-24-00:08:00','yyyy-MM-dd-HH:mm:ss'))
ORDER BY query_timestamp DESC
```

## Beispiel 3 – Abfrageprotokolle basierend auf einem angegebenen DNS-Abfragenamenmuster
<a name="querying-r53-resolver-logs-example-3-query-logs-based-on-a-specified-dns-query-name-pattern"></a>

Die folgende Abfrage wählt Datensätze aus, deren Abfragename die Zeichenfolge „example.com“ enthält.

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers
FROM "r53_rlogs"
WHERE query_name LIKE '%example.com%'
ORDER BY query_timestamp DESC
```

## Beispiel 4 – Abfrageprotokollanforderungen ohne Antwort
<a name="querying-r53-resolver-logs-example-4-query-log-requests-with-no-answer"></a>

Die folgende Abfrage wählt Protokolleinträge aus, in denen die Anforderung keine Antwort erhalten hat.

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers
FROM "r53_rlogs"
WHERE cardinality(answers) = 0
```

## Beispiel 5 – Abfragen von Protokollen mit einer bestimmten Antwort
<a name="querying-r53-resolver-logs-example-5-query-logs-with-a-specific-answer"></a>

Die folgende Abfrage zeigt Protokolle, in denen der `answer.Rdata`-Wert die angegebene IP-Adresse hat.

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answer.Rdata
FROM "r53_rlogs"
CROSS JOIN UNNEST(r53_rlogs.answers) as st(answer)
WHERE answer.Rdata='203.0.113.16';
```

# Abfragen von Amazon-SES-Ereignisprotokollen
<a name="querying-ses-logs"></a>

Sie können Amazon Athena zum Abfragen von Ereignisprotokollen des [Amazon Simple Email Service](https://aws.amazon.com/ses/) (Amazon SES) verwenden.

Amazon SES ist eine E-Mail-Plattform, die eine praktische und kostengünstige Möglichkeit bietet, E-Mails mit Ihren eigenen E-Mail-Adressen und Domänen zu versenden und zu empfangen. Sie können Ihre Amazon-SES-Versandaktivität auf granularer Ebene mithilfe von Ereignissen, Metriken und Statistiken überwachen.

Basierend auf den von Ihnen definierten Merkmalen können Sie Amazon SES SES-Ereignisse auf [Amazon CloudWatch, Amazon](https://aws.amazon.com/cloudwatch/) [Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) oder [Amazon Simple Notification Service](https://aws.amazon.com/sns/) veröffentlichen. Nachdem die Informationen in Amazon S3 gespeichert wurden, können Sie sie bei Amazon S3 von Amazon Athena abfragen. 

Ein Beispiel für eine `CREATE TABLE` Athena-Anweisung für Amazon SES SES-Protokolle, einschließlich Schritten zum Erstellen von Ansichten und zum Reduzieren verschachtelter Arrays in Amazon SES SES-Ereignisprotokolldaten, finden Sie unter „Schritt 3: Verwenden von Amazon Athena zum Abfragen der SES-Ereignisprotokolle“ im AWS Blogbeitrag [Analysieren von Amazon SES SES-Ereignisdaten](https://aws.amazon.com/blogs/messaging-and-targeting/analyzing-amazon-ses-event-data-with-aws-analytics-services/) mit Analytics Services. AWS 

# Abfragen von Amazon VPC-Flow-Protokollen
<a name="vpc-flow-logs"></a>

Amazon-Virtual-Private-Cloud-Flow-Protokolle erfassen Informationen zum IP-Datenverkehr zu und von Netzwerkschnittstellen in einer VPC. Verwenden Sie die Protokolle zur Untersuchung von Netzwerkdatenverkehrsmustern und zur Identifizierung von Bedrohungen und Risiken in Ihrem VPC-Netzwerk.

Sie haben zwei Möglichkeiten, Ihre Amazon-VPC-Flow-Protokolle abzufragen:

****
+ **Amazon VPC Console** — Verwenden Sie die Athena-Integrationsfunktion in der Amazon VPC-Konsole, um eine CloudFormation Vorlage zu generieren, die eine Athena-Datenbank-, Arbeitsgruppen- und Flow-Log-Tabelle mit Partitionierung für Sie erstellt. Die Vorlage erstellt auch eine Reihe von [Vordefinierte Flow-Protokoll-Abfragen](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-athena.html#predefined-queries), die Sie benutzen können, um Einblicke in den Verkehr zu erhalten, der durch Ihre VPC fließt.

  Informationen zu diesem Ansatz finden Sie unter [Abfrage-Flow-Protokolle mit Amazon Athena](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-athena.html) im *Amazon-VPC-Benutzerhandbuch*.
+ **Amazon-Athena-Konsole** – Erstellen Sie Ihre Tabellen und Abfragen direkt in der Athena-Konsole. Weitere Informationen finden Sie auf dieser Seite.

Bevor Sie die Protokolle in Athena abfragen, [aktivieren Sie VPC-Flow-Protokolle](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html) und konfigurieren Sie diese so, dass sie in Ihrem Amazon-S3-Bucket gespeichert werden. Nach dem Erstellen der Protokolle führen Sie diese einige Minuten lang aus, um Daten zu erfassen. Die Protokolle werden in einem GZIP-Komprimierungsformat erstellt, das Sie über Athena direkt abfragen können. 

Wenn Sie ein VPC-Flow-Protokoll erstellen, können Sie ein benutzerdefiniertes Format verwenden, wenn Sie die Felder, die im Flow-Protokoll zurückgegeben werden sollen, und die Reihenfolge, in der die Felder erscheinen, angeben möchten. Weitere Informationen zu Flow-Protokolle-Datensätzen finden Sie unter [Flow-Protokolle-Datensätze](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records) im *Amazon-VPC-Benutzerhandbuch*.

## Überlegungen und Einschränkungen
<a name="vpc-flow-logs-common-considerations"></a>

Beachten Sie beim Erstellen von Tabellen in Athena für Amazon-VPC-Flow-Protokolle die folgenden Punkte:
+ Standardmäßig greift Parquet in Athena auf Spalten nach Namen zu. Weitere Informationen finden Sie unter [Schema-Updates verarbeiten](handling-schema-updates-chapter.md).
+ Verwenden Sie die Namen in den Flow-Protokoll-Datensätzen für die Spaltennamen in Athena. Die Namen der Spalten im Athena-Schema sollten genau mit den Feldnamen in den Amazon-VPC-Flow-Protokollen übereinstimmen, mit den folgenden Unterschieden: 
  + Ersetzen Sie die Bindestriche in den Namen des Amazon-VPC-Protokollfelds durch Unterstriche in den Spaltennamen in Athena. Informationen über zulässige Zeichen für Datenbank-, Tabellen- und Spaltennamen in Athena finden Sie unter [Namen für Datenbanken, Tabellen und Spalten](tables-databases-columns-names.md).
  + Maskieren Sie die Namen der Flow-Protokoll-Datensätze, die in Athena [reservierte Schlüsselwörter](reserved-words.md) sind, indem Sie sie in Backticks einschließen. 
+ VPC-Flow-Logs sind AWS-Konto spezifisch. Wenn Sie Ihre Protokolldateien in Amazon S3 veröffentlichen, enthält der Pfad, den Amazon VPC in Amazon S3 erstellt, die ID des AWS-Konto , das für die Erstellung des Flow-Protokolls verwendet wurde. Weitere Informationen finden Sie unter [Veröffentlichen von Flow-Protokollen in Amazon S3](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-s3.html) im *Amazon-VPC-Benutzerhandbuch*.

**Topics**
+ [Überlegungen und Einschränkungen](#vpc-flow-logs-common-considerations)
+ [Erstellen Sie eine Tabelle für Amazon VPC-Flow-Protokolle und fragen Sie sie ab](vpc-flow-logs-create-table-statement.md)
+ [Erstellen von Tabellen für Flow-Protokolle im Apache-Parquet-Format](vpc-flow-logs-parquet.md)
+ [Erstellen und Abfragen einer Tabelle für Amazon-VPC-Flow-Protokolle mit Partitionsprojektion](vpc-flow-logs-partition-projection.md)
+ [Tabellen für Flow-Protokolle im Apache-Parquet-Format mit Partitionsprojektion erstellen](vpc-flow-logs-partition-projection-parquet-example.md)
+ [Weitere Ressourcen](query-examples-vpc-logs-additional-resources.md)

# Erstellen Sie eine Tabelle für Amazon VPC-Flow-Protokolle und fragen Sie sie ab
<a name="vpc-flow-logs-create-table-statement"></a>

Mit dem folgenden Verfahren wird eine Amazon-VPC-Tabelle für Amazon-VPC-Flow-Protokolle erstellt. Wenn Sie ein Flow-Protokoll mit einem benutzerdefinierten Format erstellen, erstellen Sie eine Tabelle mit Feldern, die mit den Feldern übereinstimmen, die Sie bei der Erstellung des Flow-Protokolls in der gleichen Reihenfolge angegeben haben, in der Sie sie angegeben haben.

**So erstellen Sie eine Athena-Tabelle für Amazon-VPC-Flow-Protokolle**

1. Geben Sie eine DDL-Anweisung wie die folgende in den Abfrageeditor der Athena-Konsole ein, und befolgen Sie die Richtlinien in diesem [Überlegungen und Einschränkungen](vpc-flow-logs.md#vpc-flow-logs-common-considerations)-Abschnitt. Die Beispielanweisung erstellt eine Tabelle mit den Spalten für die Amazon-VPC-Flow-Protokolle der Versionen 2 bis 5, wie in [Flow-Protokoll-Datensätze](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records) dokumentiert. Wenn Sie einen anderen Spaltensatz oder eine andere Spaltenreihenfolge verwenden, ändern Sie die Anweisung entsprechend.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` (
     version int,
     account_id string,
     interface_id string,
     srcaddr string,
     dstaddr string,
     srcport int,
     dstport int,
     protocol bigint,
     packets bigint,
     bytes bigint,
     start bigint,
     `end` bigint,
     action string,
     log_status string,
     vpc_id string,
     subnet_id string,
     instance_id string,
     tcp_flags int,
     type string,
     pkt_srcaddr string,
     pkt_dstaddr string,
     region string,
     az_id string,
     sublocation_type string,
     sublocation_id string,
     pkt_src_aws_service string,
     pkt_dst_aws_service string,
     flow_direction string,
     traffic_path int
   )
   PARTITIONED BY (`date` date)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ' '
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'
   TBLPROPERTIES ("skip.header.line.count"="1");
   ```

   Beachten Sie folgende Punkte:
   + In der Abfrage wird die Angabe von `ROW FORMAT DELIMITED` a angegeben und nicht angegeben. SerDe Das heißt, die Abfrage verwendet [Lazy Simple SerDe für CSV-, TSV- und benutzerdefinierte Dateien](lazy-simple-serde.md). Bei dieser Abfrage werden Felder durch ein Leerzeichen beendet.
   + Die `PARTITIONED BY`-Klausel verwendet den `date`-Typ. Dies ermöglicht es, in Abfragen mathematische Operatoren für eine Auswahl vor oder nach einem bestimmten Datum zu verwenden.
**Anmerkung**  
Da `date` ein reserviertes Schlüsselwort in DDL-Anweisungen ist, wird es mit Back-Tick-Zeichen maskiert. Weitere Informationen finden Sie unter [Reservierte Schlüsselwörter in Abfragen umgehen](reserved-words.md).
   + Für ein VPC-Flow-Protokoll mit einem anderen benutzerdefinierten Format ändern Sie die Felder so, dass sie den Feldern entsprechen, die Sie beim Erstellen des Flow-Protokolls angegeben haben.

1. Ändern Sie `LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'` so, dass auf den Amazon-S3-Bucket gezeigt wird, der Ihre Protokolldaten enthält.

1. Führen Sie die Abfrage in der Athena-Konsole aus. Nach Beendigung der Abfrage registriert Athena die `vpc_flow_logs`-Tabelle, sodass Sie die Daten zum Ausgeben von Abfragen nutzen können.

1. Erstellen Sie Partitionen, um die Daten lesen zu können, wie in der folgenden Beispielabfrage. Diese Abfrage erstellt eine einfache Partition für ein angegebenes Datum. Ersetzen Sie die Platzhalter für Datum und Standort nach Bedarf. 
**Anmerkung**  
Diese Abfrage erstellt für einen von Ihnen angegebenen Zeitraum lediglich eine einzige Partition. Um den Prozess zu automatisieren, verwenden Sie ein Skript, das diese Abfrage ausführt und auf diese Weise Partitionen für `year/month/day` erstellt, oder verwenden Sie eine `CREATE TABLE`-Anweisung, die die [partition projection](vpc-flow-logs-partition-projection.md) (Partitionsprojektion) angibt.

   ```
   ALTER TABLE vpc_flow_logs
   ADD PARTITION (`date`='YYYY-MM-dd')
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';
   ```

## Beispielabfragen für die Tabelle vpc\$1flow\$1logs
<a name="query-examples-vpc-logs"></a>

Verwenden Sie den Abfrage-Editor in der Athena-Konsole, um SQL-Anweisungen für die von Ihnen erstellte Tabelle auszuführen. Sie können die Abfragen speichern, frühere Abfragen anzeigen oder Abfrageergebnisse im CSV-Format herunterladen. Ersetzen Sie in den folgenden Beispielen `vpc_flow_logs` mit dem Namen Ihrer Tabelle. Ändern Sie die Spaltenwerte und andere Variablen entsprechend Ihren Anforderungen.

Die folgende Beispielabfrage listet maximal 100 Flow-Protokolle für das angegebene Datum auf.

```
SELECT * 
FROM vpc_flow_logs 
WHERE date = DATE('2020-05-04') 
LIMIT 100;
```

Mit der folgenden Abfrage werden alle abgelehnten TCP-Verbindungen aufgelistet. Die neu erstellte Datumspartitionsspalte `date` wird verwendet, um daraus den Wochentag zu extrahieren, an dem diese Ereignisse aufgetreten sind.

```
SELECT day_of_week(date) AS
  day,
  date,
  interface_id,
  srcaddr,
  action,
  protocol
FROM vpc_flow_logs
WHERE action = 'REJECT' AND protocol = 6
LIMIT 100;
```

Nutzen Sie die folgende Abfrage, um herauszufinden, welcher Ihrer Server die meisten HTTPS-Anforderungen empfängt. Bei der Abfrage werden die vom HTTPS-Port 443 empfangenen Pakete gezählt. Sie werden nach IP-Adressen gruppiert und es werden die ersten 10 der letzten Woche zurückgegeben.

```
SELECT SUM(packets) AS
  packetcount,
  dstaddr
FROM vpc_flow_logs
WHERE dstport = 443 AND date > current_date - interval '7' day
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10;
```

# Erstellen von Tabellen für Flow-Protokolle im Apache-Parquet-Format
<a name="vpc-flow-logs-parquet"></a>

Das folgende Verfahren erstellt eine Amazon-VPC-Tabelle für Amazon-VPC-Flow-Protokolle im Apache-Parquet-Format.

**So erstellen Sie eine Athena-Tabelle für Amazon-VPC-Flow-Protokolle im Parquet-Format**

1. Geben Sie eine DDL-Anweisung wie die folgende in den Abfrageeditor der Athena-Konsole ein und befolgen Sie die Richtlinien in diesem [Überlegungen und Einschränkungen](vpc-flow-logs.md#vpc-flow-logs-common-considerations)-Abschnitt. Die Beispielanweisung erstellt eine Tabelle mit den Spalten für Amazon-VPC-Flow-Protokolle Version 2 bis 5, wie in [Flow-Protokoll-Datensätze](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records) im Parquet-Format dokumentiert, Hive stündlich partitioniert. Wenn Sie keine stündlichen Partitionen haben, entfernen Sie `hour` aus der `PARTITIONED BY`-Klausel.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs_parquet (
     version int,
     account_id string,
     interface_id string,
     srcaddr string,
     dstaddr string,
     srcport int,
     dstport int,
     protocol bigint,
     packets bigint,
     bytes bigint,
     start bigint,
     `end` bigint,
     action string,
     log_status string,
     vpc_id string,
     subnet_id string,
     instance_id string,
     tcp_flags int,
     type string,
     pkt_srcaddr string,
     pkt_dstaddr string,
     region string,
     az_id string,
     sublocation_type string,
     sublocation_id string,
     pkt_src_aws_service string,
     pkt_dst_aws_service string,
     flow_direction string,
     traffic_path int
   )
   PARTITIONED BY (
     `aws-account-id` string,
     `aws-service` string,
     `aws-region` string,
     `year` string, 
     `month` string, 
     `day` string,
     `hour` string
   )
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/prefix/AWSLogs/'
   TBLPROPERTIES (
     'EXTERNAL'='true', 
     'skip.header.line.count'='1'
     )
   ```

1. Ändern Sie Beispiel-`LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/'` so, dass auf den Amazon-S3-Pfad gezeigt wird, der Ihre Protokolldaten enthält.

1. Führen Sie die Abfrage in der Athena-Konsole aus.

1. Wenn Ihre Daten im HIVE-kompatiblen Format vorliegen, führen Sie den folgenden Befehl in der Athena-Konsole aus, um die Hive-Partitionen im Metastore zu aktualisieren und zu laden. Nachdem die Abfrage abgeschlossen ist, können Sie die Daten in der `vpc_flow_logs_parquet`-Tabelle abfragen.

   ```
   MSCK REPAIR TABLE vpc_flow_logs_parquet
   ```

   Wenn Sie keine Hive-kompatiblen Daten verwenden, führen Sie [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) aus, um die Partitionen zu laden.

Weitere Informationen zur Verwendung von Athena zum Abfragen von Amazon-VPC-Flow-Protokollen im Parquet-Format finden Sie im Beitrag [Optimieren der Leistung und Reduzieren der Kosten für Netzwerkanalysen mit VPC-Flow-Protokollen im Apache-Parquet-Format](https://aws.amazon.com/blogs/big-data/optimize-performance-and-reduce-costs-for-network-analytics-with-vpc-flow-logs-in-apache-parquet-format/) im *AWS Big Data Blog*.

# Erstellen und Abfragen einer Tabelle für Amazon-VPC-Flow-Protokolle mit Partitionsprojektion
<a name="vpc-flow-logs-partition-projection"></a>

Verwenden Sie eine `CREATE TABLE`-Anweisung wie die folgende, um eine Tabelle zu erstellen, die Tabelle zu partitionieren und die Partitionen mithilfe der [partition projection](partition-projection.md) (Partitionsprojektion) automatisch aufzufüllen. Ersetzt den Tabellennamen `test_table_vpclogs` im Beispiel mit dem Namen Ihrer Tabelle. Bearbeiten Sie die `LOCATION`-Klausel, um den Amazon-S3-Bucket anzugeben, der Ihre Amazon-VPC-Protokolldaten enthält.

Folgende `CREATE TABLE`-Anweisung gilt für VPC-Flow-Protokolle, die im Partitionierungsformat im Nicht-Hive-Stil geliefert werden. Das Beispiel ermöglicht die Aggregation mehrerer Konten. Wenn Sie VPC-Ablaufprotokolle von mehreren Konten in einem Amazon-S3-Bucket zentralisieren, muss die Konto-ID im Amazon-S3-Pfad angegeben werden.

```
CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs (
  version int,
  account_id string,
  interface_id string,
  srcaddr string,
  dstaddr string,
  srcport int,
  dstport int,
  protocol bigint,
  packets bigint,
  bytes bigint,
  start bigint,
  `end` bigint,
  action string,
  log_status string,
  vpc_id string,
  subnet_id string,
  instance_id string,
  tcp_flags int,
  type string,
  pkt_srcaddr string,
  pkt_dstaddr string,
  az_id string,
  sublocation_type string,
  sublocation_id string,
  pkt_src_aws_service string,
  pkt_dst_aws_service string,
  flow_direction string,
  traffic_path int
)
PARTITIONED BY (accid string, region string, day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION '$LOCATION_OF_LOGS'
TBLPROPERTIES
(
"skip.header.line.count"="1",
"projection.enabled" = "true",
"projection.accid.type" = "enum",
"projection.accid.values" = "$ACCID_1,$ACCID_2",
"projection.region.type" = "enum",
"projection.region.values" = "$REGION_1,$REGION_2,$REGION_3",
"projection.day.type" = "date",
"projection.day.range" = "$START_RANGE,NOW",
"projection.day.format" = "yyyy/MM/dd",
"storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/${accid}/vpcflowlogs/${region}/${day}"
)
```

## Beispielabfragen für test\$1table\$1vpclogs
<a name="query-examples-vpc-logs-pp"></a>

Die folgenden Beispielabfragen fragen `test_table_vpclogs` ab, das von der vorherigen `CREATE TABLE`-Anweisung erstellt wurde. Ersetzen Sie `test_table_vpclogs` in den Abfragen mit dem Namen Ihrer eigenen Tabelle. Ändern Sie die Spaltenwerte und andere Variablen entsprechend Ihren Anforderungen.

Um die ersten 100 Zugriffsprotokolleinträge für einen bestimmten Zeitraum in chronologischer Reihenfolge zurückzugeben, führen Sie eine Abfrage wie die folgende aus.

```
SELECT *
FROM test_table_vpclogs
WHERE day >= '2021/02/01' AND day < '2021/02/28'
ORDER BY day ASC
LIMIT 100
```

Um anzuzeigen, welcher Server die zehn wichtigsten HTTP-Pakete für einen bestimmten Zeitraum erhält, führen Sie eine Abfrage wie die folgende aus. Die Abfrage zählt die Anzahl der auf HTTPS-Port 443 empfangenen Pakete, gruppiert sie nach Ziel-IP-Adresse und gibt die Top-10-Einträge der Vorwoche zurück.

```
SELECT SUM(packets) AS packetcount, 
       dstaddr
FROM test_table_vpclogs
WHERE dstport = 443
  AND day >= '2021/03/01'
  AND day < '2021/03/31'
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10
```

Um die Protokolle zurückzugeben, die während eines bestimmten Zeitraums erstellt wurden, führen Sie eine Abfrage wie die folgende aus.

```
SELECT interface_id,
       srcaddr,
       action,
       protocol,
       to_iso8601(from_unixtime(start)) AS start_time,
       to_iso8601(from_unixtime("end")) AS end_time
FROM test_table_vpclogs
WHERE DAY >= '2021/04/01'
  AND DAY < '2021/04/30'
```

Um die Zugriffsprotokolle für eine Quell-IP-Adresse zwischen bestimmten Zeiträumen zurückzugeben, führen Sie eine Abfrage wie die folgende aus.

```
SELECT *
FROM test_table_vpclogs
WHERE srcaddr = '10.117.1.22'
  AND day >= '2021/02/01'
  AND day < '2021/02/28'
```

Führen Sie eine Abfrage wie die folgende aus, um abgelehnte TCP-Verbindungen aufzulisten.

```
SELECT day,
       interface_id,
       srcaddr,
       action,
       protocol
FROM test_table_vpclogs
WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28'
LIMIT 10
```

Führen Sie eine Abfrage wie die folgende aus, um die Zugriffsprotokolle für den IP-Adressbereich zurückzugeben, der mit `10.117` beginnt.

```
SELECT *
FROM test_table_vpclogs
WHERE split_part(srcaddr,'.', 1)='10'
  AND split_part(srcaddr,'.', 2) ='117'
```

Um die Zugriffsprotokolle für eine Ziel-IP-Adresse in einem bestimmten Zeitraum zurückzugeben, führen Sie eine Abfrage wie die folgende aus.

```
SELECT *
FROM test_table_vpclogs
WHERE dstaddr = '10.0.1.14'
  AND day >= '2021/01/01'
  AND day < '2021/01/31'
```

# Tabellen für Flow-Protokolle im Apache-Parquet-Format mit Partitionsprojektion erstellen
<a name="vpc-flow-logs-partition-projection-parquet-example"></a>

Die folgende `CREATE TABLE`-Anweisung der Partitionsprojektion für VPC-Flow-Protokolle ist im Apache-Parquet-Format, nicht Hive-kompatibel und nach Stunde und Datum statt nach Tag partitioniert. Ersetzt den Tabellennamen `test_table_vpclogs_parquet` im Beispiel mit dem Namen Ihrer Tabelle. Bearbeiten Sie die `LOCATION`-Klausel, um den Amazon-S3-Bucket anzugeben, der Ihre Amazon-VPC-Protokolldaten enthält.

```
CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs_parquet (
  version int,
  account_id string,
  interface_id string,
  srcaddr string,
  dstaddr string,
  srcport int,
  dstport int,
  protocol bigint,
  packets bigint,
  bytes bigint,
  start bigint,
  `end` bigint,
  action string,
  log_status string,
  vpc_id string,
  subnet_id string,
  instance_id string,
  tcp_flags int,
  type string,
  pkt_srcaddr string,
  pkt_dstaddr string,
  az_id string,
  sublocation_type string,
  sublocation_id string,
  pkt_src_aws_service string,
  pkt_dst_aws_service string,
  flow_direction string,
  traffic_path int
)
PARTITIONED BY (region string, date string, hour string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/'
TBLPROPERTIES (
"EXTERNAL"="true",
"skip.header.line.count" = "1",
"projection.enabled" = "true",
"projection.region.type" = "enum",
"projection.region.values" = "us-east-1,us-west-2,ap-south-1,eu-west-1",
"projection.date.type" = "date",
"projection.date.range" = "2021/01/01,NOW",
"projection.date.format" = "yyyy/MM/dd",
"projection.hour.type" = "integer",
"projection.hour.range" = "00,23",
"projection.hour.digits" = "2",
"storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/AWSLogs/${account_id}/vpcflowlogs/${region}/${date}/${hour}"
)
```

# Weitere Ressourcen
<a name="query-examples-vpc-logs-additional-resources"></a>

Weitere Informationen zum Abfragen von VPC-Ablaufprotokollen mithilfe von Athena finden Sie in den folgenden Beiträgen aus dem AWS -Big-Data-Blog:
+ [Analysieren Sie VPC-Flow-Logs mit der point-and-click Amazon Athena Athena-Integration](https://aws.amazon.com/blogs/networking-and-content-delivery/analyze-vpc-flow-logs-with-point-and-click-amazon-athena-integration/) 
+ [Analysieren von VPC-Flow-Protokollen mit Amazon Athena und Quick](https://aws.amazon.com/blogs/big-data/analyzing-vpc-flow-logs-using-amazon-athena-and-amazon-quicksight/)
+ [Die Leistung optimieren und die Kosten für Netzwerkanalysen mit VPC-Ablaufprotokollen im Apache-Parquet-Format senken](https://aws.amazon.com/blogs/big-data/optimize-performance-and-reduce-costs-for-network-analytics-with-vpc-flow-logs-in-apache-parquet-format/)

# AWS WAF Logs abfragen
<a name="waf-logs"></a>

AWS WAF ist eine Firewall für Webanwendungen, mit der Sie die HTTP- und HTTPS-Anfragen überwachen und steuern können, die Ihre geschützten Webanwendungen von Clients erhalten. Sie definieren, wie die Webanfragen behandelt werden sollen, indem Sie Regeln in einer AWS WAF Web Access Control List (ACL) konfigurieren. Anschließend schützen Sie eine Webanwendung, indem Sie ihr eine Web-ACL zuordnen. Beispiele für Webanwendungsressourcen, mit denen Sie sich schützen können, AWS WAF sind CloudFront Amazon-Distributionen, Amazon API Gateway REST APIs und Application Load Balancers. Weitere Informationen zu AWS WAF finden Sie [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html)im *AWS WAF Entwicklerhandbuch*.

AWS WAF Protokolle enthalten Informationen über den Traffic, der von Ihrer Web-ACL analysiert wird, z. B. die Uhrzeit, zu der die Anfrage von Ihrer AWS Ressource AWS WAF eingegangen ist, detaillierte Informationen zu der Anfrage und die Aktion für die Regel, der jede Anfrage entsprach.

Sie können eine AWS WAF Web-ACL so konfigurieren, dass sie Protokolle an einem von mehreren Zielen veröffentlicht, wo Sie sie abfragen und anzeigen können. Weitere Informationen zur Konfiguration der Web-ACL-Protokollierung und zum Inhalt der AWS WAF Protokolle finden Sie unter [Logging AWS WAF Web ACL Traffic](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html) im *AWS WAF Entwicklerhandbuch*.

Informationen zur Verwendung von Athena zur Analyse von AWS WAF Protokollen, um Einblicke in die Erkennung von Bedrohungen und potenzielle Sicherheitsangriffe zu erhalten, finden Sie im Blogbeitrag AWS Networking & Content Delivery [So verwenden Sie Amazon Athena Athena-Abfragen, um AWS WAF Protokolle zu analysieren und die für die Bedrohungserkennung erforderliche Transparenz bereitzustellen](https://aws.amazon.com/blogs/networking-and-content-delivery/how-to-use-amazon-athena-queries-to-analyze-aws-waf-logs-and-provide-the-visibility-needed-for-threat-detection/).

Ein Beispiel dafür, wie AWS WAF Logs in einem zentralen Data Lake-Repository zusammengefasst und mit Athena abgefragt werden können, finden Sie im AWS Big-Data-Blogbeitrag [Analyzing AWS WAF logs with OpenSearch Service, Amazon Athena, and](https://aws.amazon.com/blogs/big-data/analyzing-aws-waf-logs-with-amazon-es-amazon-athena-and-amazon-quicksight/) Quick.

Dieses Thema enthält `CREATE TABLE`-Beispielanweisungen für Partitionsprojektion, manuelle Partitionierung und eine die keine Partitionierung verwendet wird.

**Anmerkung**  
Die `CREATE TABLE`-Anweisungen in diesem Thema können sowohl für Version 1 als auch für Version 2 der AWS WAF -Protokolle verwendet werden. In Version 1 enthält das `webaclid`-Feld eine ID. In Version 2 enthält das `webaclid`-Feld einen vollständigen ARN. Die `CREATE TABLE`-Anweisungen behandeln diesen Inhalt agnostisch, indem sie den `string`-Datentyp verwenden.

**Topics**
+ [Erstellen Sie eine Tabelle für AWS WAF S3-Protokolle in Athena mithilfe der Partitionsprojektion](create-waf-table-partition-projection.md)
+ [Erstellen Sie eine Tabelle für AWS WAF S3-Protokolle in Athena mithilfe der manuellen Partition](create-waf-table-manual-partition.md)
+ [Erstellen Sie eine Tabelle für AWS WAF Protokolle ohne Partitionierung](create-waf-table.md)
+ [Beispielabfragen für Logs AWS WAF](query-examples-waf-logs.md)

# Erstellen Sie eine Tabelle für AWS WAF S3-Protokolle in Athena mithilfe der Partitionsprojektion
<a name="create-waf-table-partition-projection"></a>

Da AWS WAF Protokolle eine bekannte Struktur haben, deren Partitionsschema Sie im Voraus angeben können, können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung automatisieren, indem Sie die [Athena-Partitionsprojektionsfunktion](partition-projection.md) verwenden. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von `ALTER TABLE ADD PARTITION` hinzuzufügen. 

Die folgende `CREATE TABLE` Beispielanweisung verwendet automatisch die Partitionsprojektion für AWS WAF Protokolle von einem bestimmten Datum bis heute für vier verschiedene AWS Regionen. Die `PARTITION BY`-Klausel in diesem Beispiel partitioniert nach Region und Datum, aber Sie können diesen Vorgang entsprechend Ihren Anforderungen ändern. Ändern Sie die Felder nach Bedarf, damit diese mit Ihrer Protokollausgabe übereinstimmen. Ersetzen Sie in den `storage.location.template` Klauseln `LOCATION` und die *AWS\$1ACCOUNT\$1NUMBER* Platzhalter *amzn-s3-demo-bucket* und durch Werte, die den Amazon S3 S3-Bucket-Speicherort Ihrer AWS WAF Protokolle identifizieren. Ersetzen Sie für `projection.day.range`*2021*/*01*/*01*durch das Startdatum, das Sie verwenden möchten. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen. Sie müssen `ALTER TABLE ADD PARTITION` nicht ausführen, um die Partitionen zu laden. 

```
CREATE EXTERNAL TABLE `waf_logs_partition_projection`(
  `timestamp` bigint, 
  `formatversion` int, 
  `webaclid` string, 
  `terminatingruleid` string, 
  `terminatingruletype` string, 
  `action` string, 
  `terminatingrulematchdetails` array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>, 
  `httpsourcename` string, 
  `httpsourceid` string, 
  `rulegrouplist` array<struct<rulegroupid:string,terminatingrule:struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>>,nonterminatingmatchingrules:array<struct<ruleid:string,action:string,overriddenaction:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>,excludedrules:string>>, 
  `ratebasedrulelist` array<struct<ratebasedruleid:string,limitkey:string,maxrateallowed:int>>, 
  `nonterminatingmatchingrules` array<struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>, 
  `requestheadersinserted` array<struct<name:string,value:string>>, 
  `responsecodesent` string, 
  `httprequest` struct<clientip:string,country:string,headers:array<struct<name:string,value:string>>,uri:string,args:string,httpversion:string,httpmethod:string,requestid:string,fragment:string,scheme:string,host:string>,
  `labels` array<struct<name:string>>, 
  `captcharesponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `challengeresponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `ja3fingerprint` string, 
  `ja4fingerprint` string, 
  `oversizefields` string, 
  `requestbodysize` int, 
  `requestbodysizeinspectedbywaf` int)
  PARTITIONED BY ( 
   `log_time` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/'
TBLPROPERTIES (
 'projection.enabled'='true',
  'projection.log_time.format'='yyyy/MM/dd/HH/mm',
  'projection.log_time.interval'='1',
  'projection.log_time.interval.unit'='minutes',
  'projection.log_time.range'='2025/01/01/00/00,NOW',
  'projection.log_time.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/${log_time}')
```

**Anmerkung**  
Das Format des Pfads in der `LOCATION` Klausel im Beispiel ist Standard, kann jedoch je nach der AWS WAF Konfiguration, die Sie implementiert haben, variieren. Der folgende AWS WAF Beispielprotokollpfad bezieht sich beispielsweise auf eine CloudFront Distribution:   

```
s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/cloudfronyt/2025/01/01/00/00/
```
Wenn beim Erstellen oder Abfragen Ihrer AWS WAF Protokolltabelle Probleme auftreten, überprüfen Sie den Speicherort Ihrer Protokolldaten oder Ihres [Kontakts Support](https://console.aws.amazon.com/support/home/).

Weitere Informationen zur Partitionsprojektion finden Sie unter [Partitionsprojektion mit Amazon Athena verwenden](partition-projection.md).

# Erstellen Sie eine Tabelle für AWS WAF S3-Protokolle in Athena mithilfe der manuellen Partition
<a name="create-waf-table-manual-partition"></a>

In diesem Abschnitt wird beschrieben, wie Sie mithilfe der manuellen Partition eine Tabelle für AWS WAF Protokolle erstellen.

Ersetzen Sie in den `storage.location.template` Klauseln `LOCATION` und die *AWS\$1ACCOUNT\$1NUMBER* Platzhalter *amzn-s3-demo-bucket* und durch Werte, die den Amazon S3 S3-Bucket-Speicherort Ihrer AWS WAF Protokolle identifizieren.

```
CREATE EXTERNAL TABLE `waf_logs_manual_partition`(
  `timestamp` bigint, 
  `formatversion` int, 
  `webaclid` string, 
  `terminatingruleid` string, 
  `terminatingruletype` string, 
  `action` string, 
  `terminatingrulematchdetails` array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>, 
  `httpsourcename` string, 
  `httpsourceid` string, 
  `rulegrouplist` array<struct<rulegroupid:string,terminatingrule:struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>>,nonterminatingmatchingrules:array<struct<ruleid:string,action:string,overriddenaction:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>,excludedrules:string>>, 
  `ratebasedrulelist` array<struct<ratebasedruleid:string,limitkey:string,maxrateallowed:int>>, 
  `nonterminatingmatchingrules` array<struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>, 
  `requestheadersinserted` array<struct<name:string,value:string>>, 
  `responsecodesent` string, 
  `httprequest` struct<clientip:string,country:string,headers:array<struct<name:string,value:string>>,uri:string,args:string,httpversion:string,httpmethod:string,requestid:string,fragment:string,scheme:string,host:string>, 
  `labels` array<struct<name:string>>, 
  `captcharesponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `challengeresponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `ja3fingerprint` string, 
  `ja4fingerprint` string, 
  `oversizefields` string, 
  `requestbodysize` int, 
  `requestbodysizeinspectedbywaf` int)
  PARTITIONED BY ( `year` string, `month` string, `day` string, `hour` string, `min` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/webacl/'
```

# Erstellen Sie eine Tabelle für AWS WAF Protokolle ohne Partitionierung
<a name="create-waf-table"></a>

In diesem Abschnitt wird beschrieben, wie Sie eine Tabelle für AWS WAF Protokolle ohne Partitionierung oder Partitionsprojektion erstellen.

**Anmerkung**  
Aus Leistungs- und Kostengründen empfehlen wir nicht, ein nicht partitioniertes Schema für Abfragen zu verwenden. Weitere Informationen finden Sie im AWS Big Data-Blog unter [Die 10 besten Tipps zur Leistungsoptimierung für Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/).

**Um die Tabelle zu erstellen AWS WAF**

1. Kopieren Sie die folgende DDL-Anweisung in die Athena-Konsole. Ändern Sie die Felder nach Bedarf, damit diese mit Ihrer Protokollausgabe übereinstimmen. Ändern Sie den `LOCATION` des Amazon-S3-Bucket, in dem die Protokolle gespeichert werden.

   Diese Abfrage verwendet die [OpenX JSON SerDe](openx-json-serde.md).
**Anmerkung**  
Das SerDe erwartet, dass sich jedes JSON-Dokument in einer einzigen Textzeile ohne Zeilenabschlusszeichen befindet, die die Felder im Datensatz trennen. Wenn der JSON-Text ein hübsches Druckformat hat, erhalten Sie möglicherweise eine Fehlermeldung wie HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object oder HIVE\$1CURSOR\$1ERROR:: Unerwartet JsonParseException end-of-input: erwarteter Schließpunkt für OBJECT, wenn Sie versuchen, die Tabelle nach ihrer Erstellung abzufragen. Weitere Informationen finden Sie unter [JSON-Datendateien](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) in der SerDe OpenX-Dokumentation unter GitHub. 

   ```
   CREATE EXTERNAL TABLE `waf_logs`(
     `timestamp` bigint,
     `formatversion` int,
     `webaclid` string,
     `terminatingruleid` string,
     `terminatingruletype` string,
     `action` string,
     `terminatingrulematchdetails` array <
                                       struct <
                                           conditiontype: string,
                                           sensitivitylevel: string,
                                           location: string,
                                           matcheddata: array < string >
                                             >
                                        >,
     `httpsourcename` string,
     `httpsourceid` string,
     `rulegrouplist` array <
                         struct <
                             rulegroupid: string,
                             terminatingrule: struct <
                                                 ruleid: string,
                                                 action: string,
                                                 rulematchdetails: array <
                                                                      struct <
                                                                          conditiontype: string,
                                                                          sensitivitylevel: string,
                                                                          location: string,
                                                                          matcheddata: array < string >
                                                                             >
                                                                       >
                                                   >,
                             nonterminatingmatchingrules: array <
                                                                 struct <
                                                                     ruleid: string,
                                                                     action: string,
                                                                     overriddenaction: string,
                                                                     rulematchdetails: array <
                                                                                          struct <
                                                                                              conditiontype: string,
                                                                                              sensitivitylevel: string,
                                                                                              location: string,
                                                                                              matcheddata: array < string >
                                                                                                 >
                                                                      >,
                                                                     challengeresponse: struct <
                                                                               responsecode: string,
                                                                               solvetimestamp: string
                                                                                 >,
                                                                     captcharesponse: struct <
                                                                               responsecode: string,
                                                                               solvetimestamp: string
                                                                                 >
                                                                       >
                                                                >,
                             excludedrules: string
                               >
                          >,
   `ratebasedrulelist` array <
                            struct <
                                ratebasedruleid: string,
                                limitkey: string,
                                maxrateallowed: int
                                  >
                             >,
     `nonterminatingmatchingrules` array <
                                       struct <
                                           ruleid: string,
                                           action: string,
                                           rulematchdetails: array <
                                                                struct <
                                                                    conditiontype: string,
                                                                    sensitivitylevel: string,
                                                                    location: string,
                                                                    matcheddata: array < string >
                                                                       >
                                                                >,
                                           challengeresponse: struct <
                                                               responsecode: string,
                                                               solvetimestamp: string
                                                                >,
                                           captcharesponse: struct <
                                                               responsecode: string,
                                                               solvetimestamp: string
                                                                >
                                             >
                                        >,
     `requestheadersinserted` array <
                                   struct <
                                       name: string,
                                       value: string
                                         >
                                    >,
     `responsecodesent` string,
     `httprequest` struct <
                       clientip: string,
                       country: string,
                       headers: array <
                                   struct <
                                       name: string,
                                       value: string
                                         >
                                    >,
                       uri: string,
                       args: string,
                       httpversion: string,
                       httpmethod: string,
                       requestid: string
                         >,
     `labels` array <
                  struct <
                      name: string
                        >
                   >,
     `captcharesponse` struct <
                           responsecode: string,
                           solvetimestamp: string,
                           failureReason: string
                             >,
     `challengeresponse` struct <
                           responsecode: string,
                           solvetimestamp: string,
                           failureReason: string
                           >,
     `ja3Fingerprint` string,
     `oversizefields` string,
     `requestbodysize` int,
     `requestbodysizeinspectedbywaf` int
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/prefix/'
   ```

1. Führen Sie die `CREATE EXTERNAL TABLE`-Anweisung im Abfrage-Editor der Athena-Konsole aus. Dadurch wird die `waf_logs`-Tabelle registriert und die darin enthaltenen Daten für Abfragen von Athena verfügbar gemacht.

# Beispielabfragen für Logs AWS WAF
<a name="query-examples-waf-logs"></a>

Viele der Beispielabfragen in diesem Abschnitt verwenden die zuvor erstellte Partitionsprojektionstabelle. Ändern Sie den Tabellennamen, die Spaltenwerte und andere Variablen in den Beispielen entsprechend Ihren Anforderungen. Um die Leistung Ihrer Abfragen zu verbessern und Kosten zu senken, fügen Sie die Partitionsspalte in der Filterbedingung hinzu.

**Topics**
+ [Zählen Sie Referrer, IP-Adressen oder übereinstimmende Regeln](query-examples-waf-logs-count.md)
+ [Abfrage mit Datum und Uhrzeit](query-examples-waf-logs-date-time.md)
+ [Abfrage nach blockierten Anfragen oder Adressen](query-examples-waf-logs-blocked-requests.md)

# Zählen Sie Referrer, IP-Adressen oder übereinstimmende Regeln
<a name="query-examples-waf-logs-count"></a>

In den Beispielen in diesem Abschnitt wird die Anzahl der für Sie interessanten Protokolleinträge abgefragt.
+ [Count the number of referrers that contain a specified term](#waf-example-count-referrers-with-specified-term)
+ [Count all matched IP addresses in the last 10 days that have matched excluded rules](#waf-example-count-matched-ip-addresses)
+ [Group all counted managed rules by the number of times matched](#waf-example-group-managed-rules-by-times-matched)
+ [Group all counted custom rules by number of times matched](#waf-example-group-custom-rules-by-times-matched)

**Example – Zählt die Anzahl der Referrer, die einen bestimmten Begriff enthalten**  
Die folgende Abfrage zählt die Anzahl der Referrer, die den Begriff „amazon“ für den angegebenen Datumsbereich enthalten.  

```
WITH test_dataset AS 
  (SELECT header FROM waf_logs
    CROSS JOIN UNNEST(httprequest.headers) AS t(header) WHERE "date" >= '2021/03/01'
    AND "date" < '2021/03/31')
SELECT COUNT(*) referer_count 
FROM test_dataset 
WHERE LOWER(header.name)='referer' AND header.value LIKE '%amazon%'
```

**Example – Zählt alle übereinstimmenden IP-Adressen in den letzten 10 Tagen, die mit ausgeschlossenen Regeln übereinstimmen**  
Mit der folgenden Abfrage wird die Anzahl der Male in den letzten 10 Tagen gezählt, die die IP-Adresse der ausgeschlossenen Regel in der Regelgruppe entspricht.   

```
WITH test_dataset AS 
  (SELECT * FROM waf_logs 
    CROSS JOIN UNNEST(rulegrouplist) AS t(allrulegroups))
SELECT 
  COUNT(*) AS count, 
  "httprequest"."clientip", 
  "allrulegroups"."excludedrules",
  "allrulegroups"."ruleGroupId"
FROM test_dataset 
WHERE allrulegroups.excludedrules IS NOT NULL AND from_unixtime(timestamp/1000) > now() - interval '10' day
GROUP BY "httprequest"."clientip", "allrulegroups"."ruleGroupId", "allrulegroups"."excludedrules"
ORDER BY count DESC
```

**Example – Gruppiert alle gezählten verwalteten Regeln nach der Anzahl der Treffer**  
Wenn Sie in Ihrer Web-ACL-Konfiguration vor dem 27. Oktober 2022 Regelaktionen für Regelgruppen auf Anzahl gesetzt AWS WAF haben, haben Sie Ihre Überschreibungen in der Web-ACL-JSON unter gespeichert. `excludedRules` Jetzt befindet sich die JSON-Einstellung zum Überschreiben einer Regel zum Zählen in den `ruleActionOverrides`-Einstellungen. Weitere Informationen finden Sie unter [Aktionsüberschreibungen in Regelgruppen](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-rule-group-override-options.html) im *AWS WAF -Entwicklerhandbuch*. Um verwaltete Regeln im Zähl-Modus aus der neuen Protokollstruktur zu extrahieren, fragen Sie den Wert `nonTerminatingMatchingRules` im Abschnitt `ruleGroupList` statt im Feld `excludedRules` ab, wie im folgenden Beispiel.  

```
SELECT
 count(*) AS count,
 httpsourceid,
 httprequest.clientip,
 t.rulegroupid, 
 t.nonTerminatingMatchingRules
FROM "waf_logs" 
CROSS JOIN UNNEST(rulegrouplist) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(t.nonTerminatingMatchingRules) > 0 
GROUP BY t.nonTerminatingMatchingRules, action, httpsourceid, httprequest.clientip, t.rulegroupid 
ORDER BY "count" DESC 
Limit 50
```

**Example – Gruppiert alle gezählten benutzerdefinierten Regeln nach der Anzahl der Treffer**  
Die folgende Abfrage gruppiert alle gezählten benutzerdefinierten Regeln nach der Anzahl der Übereinstimmungen.  

```
SELECT
  count(*) AS count,
         httpsourceid,
         httprequest.clientip,
         t.ruleid,
         t.action
FROM "waf_logs" 
CROSS JOIN UNNEST(nonterminatingmatchingrules) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(nonTerminatingMatchingRules) > 0 
GROUP BY t.ruleid, t.action, httpsourceid, httprequest.clientip 
ORDER BY "count" DESC
Limit 50
```

Informationen zu den Protokollspeicherorten für benutzerdefinierte Regeln und verwaltete Regelgruppen finden Sie unter [Überwachung und Optimierung](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing-activities.html) im *AWS WAF -Entwicklerhandbuch*.

# Abfrage mit Datum und Uhrzeit
<a name="query-examples-waf-logs-date-time"></a>

Die Beispiele in diesem Abschnitt enthalten Abfragen, die Datums- und Uhrzeitwerte verwenden.
+ [Return the timestamp field in human-readable ISO 8601 format](#waf-example-return-human-readable-timestamp)
+ [Return records from the last 24 hours](#waf-example-return-records-last-24-hours)
+ [Return records for a specified date range and IP address](#waf-example-return-records-date-range-and-ip)
+ [For a specified date range, count the number of IP addresses in five minute intervals](#waf-example-count-ip-addresses-in-date-range)
+ [Count the number of X-Forwarded-For IP in the last 10 days](#waf-example-count-x-forwarded-for-ip)

**Example – Gibt das Zeitstempelfeld im menschenlesbaren ISO-8601-Format zurück**  
Die folgende Abfrage verwendet die `from_unixtime`- und `to_iso8601`-Funktionen, um das `timestamp`-Feld im menschenlesbaren ISO 8601-Format zurückzugeben (z. B. `2019-12-13T23:40:12.000Z` statt `1576280412771`). Die Abfrage gibt auch den HTTP-Quellnamen, die Quell-ID und die Anforderung zurück.   

```
SELECT to_iso8601(from_unixtime(timestamp / 1000)) as time_ISO_8601,
       httpsourcename,
       httpsourceid,
       httprequest
FROM waf_logs
LIMIT 10;
```

**Example – Gibt Datensätze der letzten 24 Stunden zurück**  
Die folgende Abfrage verwendet einen Filter in der `WHERE`-Klausel, um den HTTP-Quellnamen, die HTTP-Quell-ID und die HTTP-Anforderungsfelder für Datensätze der letzten 24 Stunden zurückzugeben.  

```
SELECT to_iso8601(from_unixtime(timestamp/1000)) AS time_ISO_8601, 
       httpsourcename, 
       httpsourceid, 
       httprequest 
FROM waf_logs
WHERE from_unixtime(timestamp/1000) > now() - interval '1' day
LIMIT 10;
```

**Example – Gibt Datensätze für einen angegebenen Datumsbereich und eine IP-Adresse zurück**  
Die folgende Abfrage listet die Datensätze in einem angegebenen Datumsbereich für eine angegebene Client-IP-Adresse auf.  

```
SELECT * 
FROM waf_logs 
WHERE httprequest.clientip='53.21.198.66' AND "date" >= '2021/03/01' AND "date" < '2021/03/31'
```

**Example – Zählt Sie für einen angegebenen Datumsbereich die Anzahl der IP-Adressen in 5-Minuten-Intervallen**  
Die folgende Abfrage zählt für einen bestimmten Datumsbereich die Anzahl der IP-Adressen in fünf Minuten Intervallen.  

```
WITH test_dataset AS 
  (SELECT 
     format_datetime(from_unixtime((timestamp/1000) - ((minute(from_unixtime(timestamp / 1000))%5) * 60)),'yyyy-MM-dd HH:mm') AS five_minutes_ts,
     "httprequest"."clientip" 
     FROM waf_logs 
     WHERE "date" >= '2021/03/01' AND "date" < '2021/03/31')
SELECT five_minutes_ts,"clientip",count(*) ip_count 
FROM test_dataset 
GROUP BY five_minutes_ts,"clientip"
```

**Example — Zählen Sie die Anzahl der X-Forwarded-For IP-Adressen in den letzten 10 Tagen**  
Die folgende Abfrage filtert die Anforderungsheader und zählt die Anzahl der X-Forwarded-For IP-Adressen in den letzten 10 Tagen.  

```
WITH test_dataset AS
  (SELECT header
   FROM waf_logs
   CROSS JOIN UNNEST (httprequest.headers) AS t(header)
   WHERE from_unixtime("timestamp"/1000) > now() - interval '10' DAY) 
SELECT header.value AS ip,
       count(*) AS COUNT 
FROM test_dataset 
WHERE header.name='X-Forwarded-For' 
GROUP BY header.value 
ORDER BY COUNT DESC
```

Weitere Informationen zu Datums- und Uhrzeitfunktionen finden Sie unter [Datums- und Uhrzeitfunktionen und Operatoren](https://trino.io/docs/current/functions/datetime.html) in der Trino-Dokumentation.

# Abfrage nach blockierten Anfragen oder Adressen
<a name="query-examples-waf-logs-blocked-requests"></a>

Die Beispiele in diesem Abschnitt fragen nach blockierten Anfragen oder Adressen ab.
+ [Extract the top 100 IP addresses blocked by a specified rule type](#waf-example-extract-top-100-blocked-ip-by-rule)
+ [Count the number of times a request from a specified country has been blocked](#waf-example-count-request-blocks-from-country)
+ [Count the number of times a request has been blocked, grouping by specific attributes](#waf-example-count-request-blocks-by-attribute)
+ [Count the number of times a specific terminating rule ID has been matched](#waf-example-count-terminating-rule-id-matches)
+ [Retrieve the top 100 IP addresses blocked during a specified date range](#waf-example-top-100-ip-addresses-blocked-for-date-range)

**Example – Extrahiert die Top-100-IP-Adressen, die von einem angegebenen Regeltyp blockiert werden**  
Die folgende Abfrage extrahiert und zählt die 100 häufigsten IP-Adressen, die während des angegebenen Datumsbereichs durch die `RATE_BASED`-Beendigungsregel blockiert wurden.  

```
SELECT COUNT(httpRequest.clientIp) as count,
httpRequest.clientIp
FROM waf_logs
WHERE terminatingruletype='RATE_BASED' AND action='BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY httpRequest.clientIp
ORDER BY count DESC
LIMIT 100
```

**Example – Zählt, wie oft eine Anfrage aus einem bestimmten Land blockiert wurde**  
Die folgende Abfrage zählt, wie oft die Anforderung von einer IP-Adresse angekommen ist, die zu Irland (IE) gehört und von der `RATE_BASED`-Beendigungsregel gesperrt wurde.  

```
SELECT 
  COUNT(httpRequest.country) as count, 
  httpRequest.country 
FROM waf_logs
WHERE 
  terminatingruletype='RATE_BASED' AND 
  httpRequest.country='IE'
GROUP BY httpRequest.country
ORDER BY count
LIMIT 100;
```

**Example – Zählt, wie oft eine Anforderung blockiert wurde, gruppiert nach bestimmten Attributen**  
Die folgende Abfrage zählt, wie oft die Anfrage blockiert wurde, wobei die Ergebnisse nach WebACL RuleId, ClientIP und HTTP-Anforderungs-URI gruppiert sind.  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  terminatingruleid,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE action='BLOCK'
GROUP BY webaclid, terminatingruleid, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example – Zählt, wie oft eine bestimmte beendende Regel-ID abgeglichen wurde**  
Die folgende Abfrage zählt, wie oft eine bestimmte Beendigungsregel-ID vorkam (`WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'`). Die Abfrage gruppiert dann die Ergebnisse nach WebACL, Action, ClientIP und HTTP-Anforderungs-URI.  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  action,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'
GROUP BY webaclid, action, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example – Abrufen der Top-100-IP-Adressen, die während eines angegebenen Datumsbereichs blockiert wurden**  
Die folgende Abfrage extrahiert die Top-100-IP-Adressen, die für einen angegebenen Datumsbereich gesperrt wurden. Die Abfrage listet auch auf, wie oft die IP-Adressen gesperrt wurden.  

```
SELECT "httprequest"."clientip", "count"(*) "ipcount", "httprequest"."country"
FROM waf_logs
WHERE "action" = 'BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "ipcount" DESC limit 100
```

Informationen zum Abfragen von Amazon-S3-Protokollen finden Sie in den folgenden Themen:
+ [Wie analysiere ich meine Amazon-S3-Serverzugriffsprotokolle mit Athena?](https://aws.amazon.com/premiumsupport/knowledge-center/analyze-logs-athena/) im AWS -Wissenscenter
+ [Abfragen von Amazon-S3-Zugriffsprotokollen für Anfragen mit Amazon Athena](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-s3-access-logs-to-identify-requests.html#querying-s3-access-logs-for-requests) im Benutzerhandbuch für Amazon Simple Storage Service.
+ [Verwenden von AWS CloudTrail zum Identifizieren von Amazon-S3-Anforderungen](https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudtrail-request-identification.html) im Benutzerhandbuch für Amazon Simple Storage Service.

# Abfragen von Webserverprotokollen in Amazon S3
<a name="querying-web-server-logs"></a>

Sie können Athena verwenden, um Webserverprotokolle abzufragen, die in Amazon S3 gespeichert sind. In den Themen in diesem Abschnitt wird gezeigt, wie Tabellen in Athena erstellt werden, in denen Webserverprotokolle in einer Vielzahl von Formaten abgefragt werden.

**Topics**
+ [Apache-Protokollen in Amazon S3 abfragen](querying-apache-logs.md)
+ [Abfragen von Internetinformationsserver-Protokollen (IIS), die in Amazon S3 gespeichert sind](querying-iis-logs.md)

# Apache-Protokollen in Amazon S3 abfragen
<a name="querying-apache-logs"></a>

Sie können Amazon Athena damit [Apache HTTP Server-Protokolldateien](https://httpd.apache.org/docs/2.4/logs.html) abfragen, die in Ihrem Amazon S3 S3-Konto gespeichert sind. In diesem Thema erfahren Sie, wie Sie Tabellenschemas erstellen, um Apache-[Zugriffsprotokoll](https://httpd.apache.org/docs/2.4/logs.html#accesslog)-Dateien im allgemeinen Protokollformat abzufragen.

Zu den Feldern im allgemeinen Protokollformat gehören die Client-IP-Adresse, die Client-ID, die Benutzer-ID, der empfangene Zeitstempel der Anforderung, der Text der Clientanforderung, der Serverstatuscode und die Größe des an den Client zurückgegebenen Objekts.

Die folgenden Beispieldaten zeigen das allgemeine Apache-Protokollformat.

```
198.51.100.7 - Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## Erstellen einer Tabelle in Athena für Apache-Protokolle
<a name="querying-apache-logs-creating-a-table-in-athena"></a>

Bevor Sie Apache-Protokolle abfragen können, die in Amazon S3 gespeichert sind, müssen Sie ein Tabellenschema für Athena erstellen, in dem Sie die Protokolldaten lesen. Um eine Athena-Tabelle für Apache-Protokolle zu erstellen, können Sie die [Grok SerDe](grok-serde.md) verwenden. *Weitere Informationen zur Verwendung von Grok SerDe finden Sie unter [Writing custom grok classifiers im AWS Glue Developer](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok) Guide.*

**So erstellen Sie eine Tabelle in Athena für Apache-Webserver-Protokolle**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Kopieren Sie die folgende DDL-Anweisung und fügen Sie sie in den Abfrage-Editor der Athena-Konsole ein: Ändern Sie die Werte in `LOCATION 's3://amzn-s3-demo-bucket/apache-log-folder/'`, um auf Ihre Apache-Protokolle in Amazon S3 zu verweisen.

   ```
   CREATE EXTERNAL TABLE apache_logs (
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{USERNAME:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/apache-log-folder/';
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus, um die `apache_logs`-Tabelle zu registrieren. Wenn die Abfrage abgeschlossen ist, können Sie die Protokolle aus Athena abfragen.

### Beispielabfragen
<a name="querying-apache-logs-example-select-queries"></a>

**Example – Filterung nach 404-Fehlern**  
Die folgende Beispielabfrage wählt die Empfangszeit der Anforderung, den Text der Clientanforderung und den Serverstatuscode aus der `apache_logs`-Tabelle aus. Die `WHERE`-Klausel filtert nach HTTP-Statuscode `404` (Seite nicht gefunden)  

```
SELECT request_received_time, client_request, server_status
FROM apache_logs
WHERE server_status = '404'
```
Das folgende Image zeigt die Ergebnisse der Abfrage im Athena-Abfrage-Editor.  

![\[Abfragen eines Apache-Protokolls von Athena für HTTP-404-Einträge.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-apache-logs-1.png)


**Example – Filterung nach erfolgreichen Anfragen**  
Die folgende Beispielabfrage wählt die Benutzer-ID, die Empfangszeit der Anforderung, den Text der Clientanforderung und den Serverstatuscode aus der `apache_logs`-Tabelle aus. Die `WHERE`-Klausel filtert nach HTTP-Statuscode `200` (erfolgreich).  

```
SELECT user_id, request_received_time, client_request, server_status
FROM apache_logs
WHERE server_status = '200'
```
Das folgende Image zeigt die Ergebnisse der Abfrage im Athena-Abfrage-Editor.  

![\[Abfragen eines Apache-Protokolls von Athena für HTTP-200-Einträge.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-apache-logs-2.png)


**Example – Filterung nach Zeitstempel**  
Im folgenden Beispiel werden Datensätze abgefragt, deren Empfangszeit der Anfrage länger als der angegebene Zeitstempel ist.  

```
SELECT * FROM apache_logs WHERE request_received_time > 10/Oct/2023:00:00:00
```

# Abfragen von Internetinformationsserver-Protokollen (IIS), die in Amazon S3 gespeichert sind
<a name="querying-iis-logs"></a>

Sie können Amazon Athena verwenden, um die Webserverprotokolle von Microsoft Internet Information Services (IIS) abzufragen, die in Ihrem Amazon-S3-Konto gespeichert sind. Obwohl IIS eine [Vielzahl](https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525807(v%3Dvs.90)) von Protokolldateiformaten verwendet, zeigt Ihnen dieses Thema, wie Sie Tabellenschemas erstellen, um W3C-erweiterte Protokolle und Protokolle im IIS-Protokolldateiformat von Athena abzufragen.

Da die Protokolldateiformate W3C Extended und IIS Einzelzeichen-Trennzeichen (Leerzeichen bzw. Kommas) verwenden und keine Werte in Anführungszeichen enthalten, können Sie die verwenden, um Athena-Tabellen für [LazySimpleSerDe](lazy-simple-serde.md)sie zu erstellen.

**Topics**
+ [Erweitertes W3C-Protokolldateienformat](querying-iis-logs-w3c-extended-log-file-format.md)
+ [IIS-Protokolldateiformat abfragen](querying-iis-logs-iis-log-file-format.md)
+ [NCSA-Protokolldateiformat abfragen](querying-iis-logs-ncsa-log-file-format.md)

# Erweitertes W3C-Protokolldateienformat
<a name="querying-iis-logs-w3c-extended-log-file-format"></a>

Das [erweiterte W3C](https://docs.microsoft.com/en-us/windows/win32/http/w3c-logging)-Protokolldateidatenformat hat durch Leerzeichen getrennte Felder. Die Felder, die in erweiterten W3C-Protokollen erscheinen, werden von einem Webserver-Administrator bestimmt, der auswählt, welche Protokollfelder eingeschlossen werden sollen. Die folgenden Beispielprotokolldaten enthalten die Felder `date, time`, `c-ip`, `s-ip`, `cs-method`, `cs-uri-stem`, `sc-status`, `sc-bytes`, `cs-bytes`, `time-taken` und `cs-version`.

```
2020-01-19 22:48:39 203.0.113.5 198.51.100.2 GET /default.html 200 540 524 157 HTTP/1.0
2020-01-19 22:49:40 203.0.113.10 198.51.100.12 GET /index.html 200 420 324 164 HTTP/1.0
2020-01-19 22:50:12 203.0.113.12 198.51.100.4 GET /image.gif 200 324 320 358 HTTP/1.0
2020-01-19 22:51:44 203.0.113.15 198.51.100.16 GET /faq.html 200 330 324 288 HTTP/1.0
```

## Erstellen einer Tabelle in Athena für erweiterte W3C-Protokolle
<a name="querying-iis-logs-creating-a-table-in-athena-for-w3c-extended-logs"></a>

Bevor Sie Ihre erweiterten W3C-Protokolle abfragen können, müssen Sie ein Tabellenschema erstellen, damit Athena die Protokolldaten lesen kann.

**So erstellen Sie eine Tabelle in Athena für erweiterte W3C-Protokolle**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Fügen Sie eine DDL-Anweisung wie folgt in die Athena-Konsole ein und beachten Sie folgende Punkte:

   1. Fügen Sie die Spalten im Beispiel hinzu, oder entfernen Sie sie, damit sie den Feldern in den Protokollen entsprechen, die Sie abfragen möchten.

   1. Spaltennamen im erweiterten W3C-Format für Protokolldateien enthalten Bindestriche (`-`). In Übereinstimmung mit den [Athena-Namenskonventionen](tables-databases-columns-names.md) werden sie jedoch in der `CREATE TABLE`-Beispielanweisung durch Unterstriche (`_`) ersetzt.

   1. Um das Leerzeichen anzugeben, verwenden Sie `FIELDS TERMINATED BY ' '`.

   1. Ändern Sie die Werte in `LOCATION 's3://amzn-s3-demo-bucket/w3c-log-folder/'` so, dass sie auf Ihre erweiterten W3C-Protokolle in Amazon S3 verweisen.

   ```
   CREATE EXTERNAL TABLE `iis_w3c_logs`( 
     date_col string, 
     time_col string, 
     c_ip string,
     s_ip string,
     cs_method string, 
     cs_uri_stem string, 
     sc_status string,
     sc_bytes string,
     cs_bytes string,
     time_taken string,
     cs_version string
     ) 
   ROW FORMAT DELIMITED  
     FIELDS TERMINATED BY ' '  
   STORED AS INPUTFORMAT  
     'org.apache.hadoop.mapred.TextInputFormat'  
   OUTPUTFORMAT  
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
   LOCATION   's3://amzn-s3-demo-bucket/w3c-log-folder/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus, um die `iis_w3c_logs`-Tabelle zu registrieren. Wenn die Abfrage abgeschlossen ist, können Sie die Protokolle aus Athena abfragen.

## Beispiel für eine erweiterte W3C-Protokoll-Auswahlabfrage
<a name="querying-iis-logs-example-w3c-extended-log-select-query"></a>

Die folgende Beispielabfrage wählt Datum, Uhrzeit, Anforderungsziel und die für die Anforderung benötigte Zeit aus der Tabelle `iis_w3c_logs` aus. Die `WHERE`-Klausel filtert nach Fällen, in denen die HTTP-Methode `GET` und der HTTP-Statuscode `200` (erfolgreich) ist.

```
SELECT date_col, time_col, cs_uri_stem, time_taken
FROM iis_w3c_logs
WHERE cs_method = 'GET' AND sc_status = '200'
```

Das folgende Image zeigt die Ergebnisse der Abfrage im Athena-Abfrage-Editor.

![\[Beispielabfrageergebnisse in Athena von erweiterten W3C-Protokolldateien, die in Amazon S3 gespeichert sind.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-iis-logs-1.png)


## Datums- und Zeitfelder kombinieren
<a name="querying-iis-logs-example-w3c-extended-log-combining-date-and-time"></a>

Die durch Leerzeichen getrennten `date`- und `time`-Felder sind separate Einträge in den Protokollquelldaten, aber Sie können sie bei Bedarf zu einem Zeitstempel kombinieren. Verwenden Sie die Funktionen [concat()](https://prestodb.io/docs/current/functions/string.html#concat) und [date\$1parse()](https://prestodb.io/docs/current/functions/datetime.html#date_parse) in einer [SELECT](select.md)- oder [CREATE TABLE AS SELECT](create-table-as.md)-Abfrage, um die Datums- und Uhrzeitspalten zu verketten und in das Zeitstempelformat zu konvertieren. Im folgenden Beispiel wird eine CTAS-Abfrage verwendet, um eine neue Tabelle mit einer `derived_timestamp`-Spalte zu erstellen.

```
CREATE TABLE iis_w3c_logs_w_timestamp AS
SELECT 
  date_parse(concat(date_col,' ', time_col),'%Y-%m-%d %H:%i:%s') as derived_timestamp, 
  c_ip, 
  s_ip, 
  cs_method, 
  cs_uri_stem, 
  sc_status, 
  sc_bytes, 
  cs_bytes, 
  time_taken, 
  cs_version
FROM iis_w3c_logs
```

Nachdem die Tabelle erstellt wurde, können Sie die neue Zeitstempelspalte direkt abfragen, wie im folgenden Beispiel.

```
SELECT derived_timestamp, cs_uri_stem, time_taken
FROM iis_w3c_logs_w_timestamp
WHERE cs_method = 'GET' AND sc_status = '200'
```

Das folgende Image zeigt die Ergebnisse der Abfrage.

![\[Abfrageergebnisse der erweiterten W3C-Protokolldatei für eine Tabelle mit einer abgeleiteten Zeitstempelspalte.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-iis-logs-1a.png)


# IIS-Protokolldateiformat abfragen
<a name="querying-iis-logs-iis-log-file-format"></a>

Im Gegensatz zum erweiterten W3C-Format verfügt das [IIS-Protokolldateiformat](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc728311(v%3dws.10)) über einen festen Satz von Feldern und enthält ein Komma als Trennzeichen. Das LazySimpleSerDe behandelt das Komma als Trennzeichen und das Leerzeichen nach dem Komma als Anfang des nächsten Felds.

Das folgende Beispiel zeigt Beispieldaten im IIS-Protokolldateiformat.

```
203.0.113.15, -, 2020-02-24, 22:48:38, W3SVC2, SERVER5, 198.51.100.4, 254, 501, 488, 200, 0, GET, /index.htm, -, 
203.0.113.4, -, 2020-02-24, 22:48:39, W3SVC2, SERVER6, 198.51.100.6, 147, 411, 388, 200, 0, GET, /about.html, -, 
203.0.113.11, -, 2020-02-24, 22:48:40, W3SVC2, SERVER7, 198.51.100.18, 170, 531, 468, 200, 0, GET, /image.png, -, 
203.0.113.8, -, 2020-02-24, 22:48:41, W3SVC2, SERVER8, 198.51.100.14, 125, 711, 868, 200, 0, GET, /intro.htm, -,
```

## Erstellen einer Tabelle in Athena für IIS-Protokolldateien
<a name="querying-iis-logs-creating-a-table-in-athena-for-iis-log-files"></a>

Um die Protokolle des IIS-Protokolldateiformats in Amazon S3 abzufragen, erstellen Sie zunächst ein Tabellenschema, damit Athena die Protokolldaten lesen kann.

**So erstellen Sie eine Tabelle in Athena für Protokolle im IIS-Protokolldateiformat**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Fügen Sie die folgende DDL-Anweisung in die Athena-Konsole ein und beachten Sie dabei die folgenden Punkte:

   1. Verwenden Sie `FIELDS TERMINATED BY ','`, um das Kommatrennzeichen anzugeben.

   1. Ändern Sie die Werte in LOCATION 's3://amzn-s3-demo-bucket/*iis-log-file-folder*/' so, dass sie auf Ihre Protokolldateien im IIS-Protokollformat in Amazon S3 verweisen.

   ```
   CREATE EXTERNAL TABLE `iis_format_logs`(
   client_ip_address string,
   user_name string,
   request_date string,
   request_time string,
   service_and_instance string,
   server_name string,
   server_ip_address string,
   time_taken_millisec string,
   client_bytes_sent string,
   server_bytes_sent string,
   service_status_code string,
   windows_status_code string,
   request_type string,
   target_of_operation string,
   script_parameters string
      )
   ROW FORMAT DELIMITED
     FIELDS TERMINATED BY ','
   STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/iis-log-file-folder/'
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus, um die `iis_format_logs`-Tabelle zu registrieren. Wenn die Abfrage abgeschlossen ist, können Sie die Protokolle aus Athena abfragen.

## Beispiel für IIS-Protokollformat-Auswahlabfrage
<a name="querying-iis-logs-example-iis-log-format-select-query"></a>

Die folgende Beispielabfrage wählt das Anforderungsdatum, die Anforderungszeit, das Anforderungsziel und die benötigte Zeit in Millisekunden aus der Tabelle `iis_format_logs` aus. Die `WHERE`-Klausel filtert nach Fällen, in denen der Anforderungstyp `GET` und der HTTP-Statuscode `200` (erfolgreich) ist. Beachten Sie in der Abfrage, dass die führenden Leerzeichen in `' GET'` und `' 200'` erforderlich sind, damit die Abfrage erfolgreich ist. 

```
SELECT request_date, request_time, target_of_operation, time_taken_millisec
FROM iis_format_logs
WHERE request_type = ' GET' AND service_status_code = ' 200'
```

Das folgende Image zeigt die Ergebnisse der Abfrage der Beispieldaten.

![\[Beispielabfrageergebnisse in Athena von Protokolldateien im IIS-Protokolldateiformat, die in Amazon S3 gespeichert sind.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-iis-logs-2.png)


# NCSA-Protokolldateiformat abfragen
<a name="querying-iis-logs-ncsa-log-file-format"></a>

IIS verwendet auch das [NCSA-Protokollierungsformat](https://docs.microsoft.com/en-us/windows/win32/http/ncsa-logging), das eine feste Anzahl von Feldern im ASCII-Textformat aufweist, die durch Leerzeichen getrennt sind. Die Struktur ähnelt dem allgemeinen Protokollformat, das für Apache-Zugriffsprotokolle verwendet wird. Felder im allgemeinen NCSA-Protokolldatenformat umfassen die Client-IP-Adresse, die Client-ID (wird normalerweise nicht verwendet), die Domäne\$1Benutzer-ID, den Zeitstempel der empfangenen Anforderung, den Text der Client-Anfrage, den Serverstatuscode und die Größe des an den Client zurückgegebenen Objekts .

Das folgende Beispiel zeigt Daten im allgemeinen NCSA-Protokollformat, wie für IIS dokumentiert.

```
198.51.100.7 - ExampleCorp\Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - AnyCompany\Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - ExampleCorp\Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - AnyCompany\Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - ExampleCorp\Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - AnyCompany\Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - ExampleCorp\Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## Eine Tabelle in Athena für IIS-NCSA-Webserverprotokolle erstellen
<a name="querying-iis-logs-ncsa-creating-a-table-in-athena"></a>

Für Ihre `CREATE TABLE`-Anweisung können Sie das [Grok SerDe](grok-serde.md)- und ein grok-Muster ähnlich dem für [Apache-Webserver-Protokolle](querying-apache-logs.md) verwenden. Im Gegensatz zu Apache-Protokollen verwendet das grok-Muster `%{DATA:user_id}` für das dritte Feld anstelle von `%{USERNAME:user_id}`, um das Vorhandensein des umgekehrten Schrägstrichs in `domain\user_id` zu berücksichtigen. *Weitere Informationen zur Verwendung von Grok SerDe finden Sie unter [Writing Custom Classifiers](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok) im Developer Guide.AWS Glue *

**So erstellen Sie eine Tabelle in Athena für IIS-NCSA-Webserverprotokolle**

1. Öffnen Sie die Athena-Konsole unter [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Kopieren Sie die folgende DDL-Anweisung und fügen Sie sie in den Abfrage-Editor der Athena-Konsole ein: Ändern Sie die Werte in `LOCATION 's3://amzn-s3-demo-bucket/iis-ncsa-logs/'`, um auf Ihre IIS-NCSA-Protokolle in Amazon S3 zu verweisen.

   ```
   CREATE EXTERNAL TABLE iis_ncsa_logs(
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{DATA:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/iis-ncsa-logs/';
   ```

1. Führen Sie die Abfrage in der Athena-Konsole aus, um die `iis_ncsa_logs`-Tabelle zu registrieren. Wenn die Abfrage abgeschlossen ist, können Sie die Protokolle aus Athena abfragen.

## Beispielauswahlabfragen für IIS-NCSA-Protokolle auswählen
<a name="querying-iis-logs-ncsa-example-select-queries"></a>

**Example – Filterung nach 404-Fehlern**  
Die folgende Beispielabfrage wählt die Empfangszeit der Anforderung, den Text der Clientanforderung und den Serverstatuscode aus der `iis_ncsa_logs`-Tabelle aus. Die `WHERE`-Klausel filtert nach HTTP-Statuscode `404` (Seite nicht gefunden)  

```
SELECT request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '404'
```
Das folgende Image zeigt die Ergebnisse der Abfrage im Athena-Abfrage-Editor.  

![\[Abfragen eines IIS-NCSA-Protokolls von Athena für HTTP-404-Einträge.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-iis-logs-3.png)


**Example – Filtern nach erfolgreichen Anforderungen aus einer bestimmten Domäne**  
Die folgende Beispielabfrage wählt die Benutzer-ID, die Empfangszeit der Anforderung, den Text der Clientanforderung und den Serverstatuscode aus der `iis_ncsa_logs`-Tabelle aus. Die `WHERE`-Klausel filtert nach Anforderungen mit dem HTTP-Statuscode `200` (erfolgreich) von Benutzern in der `AnyCompany`-Domäne.  

```
SELECT user_id, request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '200' AND user_id LIKE 'AnyCompany%'
```
Das folgende Image zeigt die Ergebnisse der Abfrage im Athena-Abfrage-Editor.  

![\[Abfragen eines IIS-NCSA-Protokolls von Athena für HTTP-200-Einträge.\]](http://docs.aws.amazon.com/de_de/athena/latest/ug/images/querying-iis-logs-4.png)
