Schritt 2: Erstellen einer Tabelle
Nachdem Sie nun eine Datenbank haben, können Sie eine Athena-Tabelle dafür erstellen. Die von Ihnen erstellte Tabelle basiert auf Amazon-CloudFront-Beispielprotokolldaten am Standort s3://athena-examples-, wobei myregion/cloudfront/plaintext/myregion Ihre aktuelle AWS-Region ist.
Die Beispielprotokolldaten liegen im Format von tabulatorgetrennten Werten (TSV) vor, was bedeutet, dass ein Tabulatorzeichen als Trennzeichen verwendet wird, um die Felder zu trennen. Die Daten sollten wie das folgende Beispiel aussehen. Zur besseren Lesbarkeit wurden die Tabulatoren im Auszug in Leerzeichen umgewandelt und das letzte Feld gekürzt.
2014-07-05 20:00:09 DFW3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:09 DFW3 4252 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:10 AMS1 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-3.jpeg 200 - Mozilla/5.0[...]Damit Athena diese Daten lesen kann, können Sie eine einfache CREATE
EXTERNAL TABLE-Anweisung wie die folgende erstellen. Die Anweisung, mit der die Tabelle erstellt wird, definiert Spalten, die den Daten zugeordnet werden, legt fest, wie die Daten getrennt werden, und gibt den Amazon-S3-Speicherort an, an dem die Beispieldaten enthalten sind. Beachten Sie: Da Athena erwartet, alle Dateien in einem Ordner zu scannen, gibt die LOCATION-Klausel einen Amazon-S3-Ordnerspeicherort an, keine bestimmte Datei.
Verwenden Sie dieses Beispiel noch nicht, da es eine wichtige Einschränkung hat, die in Kürze erläutert wird.
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
`Date` DATE,
Time STRING,
Location STRING,
Bytes INT,
RequestIP STRING,
Method STRING,
Host STRING,
Uri STRING,
Status INT,
Referrer STRING,
ClientInfo STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 's3://athena-examples-my-region/cloudfront/plaintext/';Im Beispiel wird eine Tabelle mit dem Namen cloudfront_logs erstellt und für jedes Feld ein Name und ein Datentyp angegeben. Diese Felder werden zu den Spalten in der Tabelle. Da date ein reserviertes Wort ist, wird es mit einem Backtick-Zeichen (`) maskiert. ROW FORMAT DELIMITED bedeutet, dass Athena eine Standardbibliothek namens LazySimpleSerDe verwendet, um die eigentliche Arbeit des Parsens der Daten zu erledigen. Das Beispiel gibt auch an, dass die Felder durch Tabulatoren getrennt sind (FIELDS TERMINATED BY '\t') und dass jeder Datensatz in der Datei mit einem Zeilenumbruchzeichen (LINES TERMINATED BY '\n) endet. Schließlich gibt die LOCATION-Klausel den Pfad in Amazon S3 an, in dem sich die tatsächlich zu lesenden Daten befinden.
Wenn Sie über eigene tabulator- oder kommagetrennte Daten verfügen, können Sie eine CREATE
TABLE-Anweisung wie im gerade vorgestellten Beispiel verwenden – sofern Ihre Felder keine verschachtelten Informationen enthalten. Wenn Sie jedoch eine Spalte wie ClientInfo haben, die verschachtelte Informationen enthält, die ein anderes Trennzeichen verwenden, ist ein anderer Ansatz erforderlich.
Extrahieren von Daten aus dem Feld ClientInfo
Anhand der Beispieldaten sehen Sie hier ein vollständiges Beispiel für das endgültige Feld ClientInfo:
Mozilla/5.0%20(Android;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9Wie Sie sehen können, ist dieses Feld mehrwertig. Da in der soeben vorgestellten CREATE
TABLE-Beispielanweisung Tabulatoren als Feldtrennzeichen angegeben sind, können die einzelnen Komponenten innerhalb des ClientInfo-Feldes nicht in separate Spalten aufgeteilt werden. Daher ist eine neue CREATE TABLE-Anweisung erforderlich.
Um Spalten aus den Werten innerhalb des ClientInfo-Felds zu erstellen, können Sie einen regulären AusdruckCREATE TABLE-Anweisung zu verwenden, verwenden Sie eine Syntax wie die folgende. Diese Syntax weist Athena an, die Regex SerDe-Bibliothek und den von Ihnen angegebenen regulären Ausdruck zu verwenden.
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "regular_expression")
Reguläre Ausdrücke können nützlich sein, um Tabellen aus komplexen CSV- oder TSV-Daten zu erstellen, können aber schwierig zu schreiben und zu warten sein. Glücklicherweise gibt es andere Bibliotheken, die Sie für Formate wie JSON, Parquet und ORC verwenden können. Weitere Informationen finden Sie unter Einen SerDe für Ihre Daten wählen.
Jetzt können Sie die Tabelle im Athena-Abfrage-Editor erstellen. Die CREATE
TABLE-Anweisung und Regex werden für Sie bereitgestellt.
So erstellen Sie eine Tabelle in Athena
-
Stellen Sie im Navigationsbereich für Database (Datenbank) sicher, dass
mydatabaseausgewählt ist. -
Um mehr Platz im Abfrageeditor zu schaffen, können Sie das Pfeilsymbol auswählen, um den Navigationsbereich zu reduzieren.
-
Um eine Registerkarte für eine neue Abfrage zu erstellen, wählen Sie im Abfrageeditor das Pluszeichen (+). Sie können bis zu zehn Abfrageregisterkarten gleichzeitig öffnen.
-
Um eine oder mehrere Abfrage-Registerkarten zu schließen, wählen Sie den Pfeil neben dem Pluszeichen aus. Um alle Registerkarten gleichzeitig zu schließen, wählen Sie den Pfeil und wählen Sie dann Close all tabs (Schließen aller Tabs) aus.
-
Geben Sie im Abfragebereich die folgende
CREATE EXTERNAL TABLE-Anweisung ein. Die Regex bricht die Informationen zu Betriebssystem, Browser und Browserversion aus demClientInfo-Feld in den Protokolldaten aus.Anmerkung
Die im folgenden Beispiel verwendete Regex ist für die Verwendung mit den öffentlich verfügbaren CloudFront-Beispielprotokolldaten am
athena-examples-Amazon-S3-Speicherort konzipiert und dient nur zur Veranschaulichung. Aktuellere reguläre Ausdrücke, die sowohl Standard- als auch Echtzeit-CloudFront-Protokolldateien abfragen, finden Sie unter Abfragen von Amazon CloudFront-Protokolle.CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` DATE, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, os STRING, Browser STRING, BrowserVersion STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$" ) LOCATION 's3://athena-examples-myregion/cloudfront/plaintext/'; -
Ersetzen Sie in der
LOCATION-Anweisungmyregiondurch die AWS-Region, die Sie zurzeit verwenden (z. B.us-west-1). -
Klicken Sie auf Ausführen.
Die Tabelle „
cloudfront_logs“ wird erstellt und unter der Liste Tables (Tabellen) für diemydatabase-Datenbank angezeigt.