Daten in Athena partitionieren - Amazon Athena

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.

Daten in Athena partitionieren

Durch eine Datenpartitionierung können Sie die pro Abfrage durchsuchte Datenmenge eingrenzen und so die Leistung verbessern sowie Kosten senken. Sie können Ihre Daten nach jedem beliebigen Schlüssel partitionieren. In der Regel werden die Daten zeitbasiert partitioniert und das führt häufig zu einem Multi-Level-Partitionierungsschema. Beispielsweise kann ein Kunde, bei dem stündlich Daten eingehen, diese nach Jahr, Monat, Datum und Stunde partitionieren. Ein anderer Kunde, der über Daten aus vielen verschiedenen Quellen verfügt, die jedoch nur einmal pro Tag geladen werden, kann nach einer Datenquellenkennung und einem Datum partitionieren.

Athena kann Partitionen im Apache-Hive-Stil verwenden, deren Datenpfade Schlüsselwertpaare enthalten, die durch Gleichheitszeichen verbunden sind (z. B. country=us/... oder year=2021/month=01/day=26/...). Daher enthalten die Pfade sowohl die Namen der Partitionsschlüssel als auch die Werte, die jeder Pfad darstellt. Um neue Hive-Partitionen in eine partitionierte Tabelle zu laden, können Sie den MSCK REPAIR TABLE-Befehl verwenden, der nur mit Partitionen im Hive-Stil funktioniert.

Athena kann auch Partitionierungsschemata im Nicht-Hive-Stil verwenden. Beispielsweise verwenden CloudTrail Logs und Firehose-Lieferdatenströme separate Pfadkomponenten für Datenteile wiedata/2021/01/26/us/6fc7845e.json. Bei solchen Partitionen im Nicht-Hive-Stil können Sie ALTER TABLE ADD PARTITION verwenden, um die Partitionen manuell hinzuzufügen.

Überlegungen und Einschränkungen

Beachten Sie bei der Verwendung der Partitionierung die folgenden Punkte:

  • Wenn Sie eine partitionierte Tabelle abfragen und die Partition in der WHERE-Klausel angeben, scannt Athena nur die Daten aus dieser Partition. Weitere Informationen finden Sie unter Tabellenspeicherort und Partitionen.

  • Wenn Sie Abfragen gegen Amazon-S3-Buckets mit einer großen Anzahl von Objekten ausgeben und die Daten nicht partitioniert sind, können sich solche Abfragen auf die Grenzwerte für die GET-Anforderungsrate in Amazon S3 auswirken und zu Amazon-S3-Ausnahmen führen. Um Fehler zu vermeiden, partitionieren Sie Ihre Daten. Überlegen Sie zusätzlich, ob Sie Ihre Amazon-S3-Anforderungsraten optimieren möchten. Weitere Informationen finden Sie unter Bewährte Methoden für Designmuster: Optimieren der Amazon-S3-Leistung .

  • Partitionsspeicherorte zur Verwendung mit Athena müssen das s3-Protokoll verwenden (z. B. s3://DOC-EXAMPLE-BUCKET/folder/). In Athena führen Speicherorte, die andere Protokolle verwenden (z. B. s3a://DOC-EXAMPLE-BUCKET/folder/), zu Abfragefehlern, wenn MSCK REPAIR TABLE-Abfragen für die enthaltenen Tabellen ausgeführt werden.

  • Achten Sie darauf, dass der Amazon-S3-Pfad in Kleinbuchstaben und nicht mit der Camel-Case-Schreibweise geschrieben ist (z. B. userid statt userId). Wenn der S3-Pfad in Camel-Case geschrieben ist, fügt MSCK REPAIR TABLE die Partitionen nicht zu AWS Glue Data Catalog hinzu. Weitere Informationen finden Sie unter MSCK REPAIR TABLE.

  • Da es sich bei MSCK REPAIR TABLE durchsucht sowohl einen Ordner als auch seine Unterordner, um ein übereinstimmendes Partitionsschema zu finden. Achten Sie darauf, dass die Daten für separate Tabellen in separaten Ordnerhierarchien aufbewahrt werden. Nehmen wir beispielsweise an, Sie haben Daten für Tabelle 1 in s3://DOC-EXAMPLE-BUCKET1 und Daten für Tabelle 2 ins3://DOC-EXAMPLE-BUCKET1/table-2-data. Wenn beide Tabellen nach einer Zeichenfolge partitioniert sind, MSCK REPAIR TABLE werden die Partitionen für Tabelle 2 zu Tabelle 1 hinzugefügt. Um dies zu vermeiden, verwenden Sie s3://DOC-EXAMPLE-BUCKET2 stattdessen separate Ordnerstrukturen wie s3://DOC-EXAMPLE-BUCKET1 und. Beachten Sie, dass dieses Verhalten mit Amazon EMR und Apache Hive konsistent ist.

  • Wenn Sie das AWS Glue Data Catalog mit Athena verwenden, finden Sie unter AWS Glue Endpunkte und Kontingente Informationen zu Dienstkontingenten auf Partitionen pro Konto und pro Tabelle.

  • Um eine Erhöhung des Partitionskontingents zu beantragen, wenn Sie den verwenden AWS Glue Data Catalog, besuchen Sie die Service Quotas Quota-Konsole für AWS Glue.

Erstellen und Laden einer Tabelle mit partitionierten Daten

Um eine Tabelle zu erstellen, verwenden Sie die PARTITIONED BY-Klausel in Ihrer CREATE TABLE-Anweisung. Die PARTITIONED BY-Klausel definiert die Schlüssel, mit denen Daten partitioniert werden sollen, wie im folgenden Beispiel. Die LOCATION-Klausel gibt den Stammspeicherort der partitionierten Daten an.

CREATE EXTERNAL TABLE users ( first string, last string, username string ) PARTITIONED BY (id string) STORED AS parquet LOCATION 's3://DOC-EXAMPLE-BUCKET'

Nachdem Sie die Tabelle erstellt haben, laden Sie die Daten in den Partitionen für die Abfrage. Bei Partitionen im Hive-Stil führen Sie MSCK REPAIR TABLE aus. Bei Partitionen im Nicht-Hive-Stil verwenden Sie ALTER TABLE ADD PARTITION, um die Partitionen manuell hinzuzufügen.

Vorbereiten von Hive-artigen- und Nicht-Hive-artigen Daten für die Abfrage

In den folgenden Abschnitten wird gezeigt, wie Sie Hive-Stil- und Nicht-Hive-Stil-Daten für die Abfrage in Athena vorbereiten.

Szenario 1: Daten, die im Hive-Format auf Amazon S3 gespeichert sind

Die Partitionen in diesem Szenario werden in Amazon S3 in separaten Ordnern gespeichert. Hier ist beispielsweise die teilweise Auflistung für Beispiel-Anzeigenimpressionen, die vom aws s3 ls-Befehl ausgegeben werden, der die S3-Objekte unter einem angegebenen Präfix auflistet:

aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/ PRE dt=2009-04-12-13-00/ PRE dt=2009-04-12-13-05/ PRE dt=2009-04-12-13-10/ PRE dt=2009-04-12-13-15/ PRE dt=2009-04-12-13-20/ PRE dt=2009-04-12-14-00/ PRE dt=2009-04-12-14-05/ PRE dt=2009-04-12-14-10/ PRE dt=2009-04-12-14-15/ PRE dt=2009-04-12-14-20/ PRE dt=2009-04-12-15-00/ PRE dt=2009-04-12-15-05/

Die Protokolle werden hier mit dem Spaltennamen (dt) gespeichert, der auf Datums- und Uhrzeitangaben gesetzt ist. Wenn Sie eine DDL mit dem Speicherort des übergeordneten Ordners, dem Schema und dem Namen der partitionierten Spalte angeben, kann Athena Abfragen für die Daten in diesen Unterordnern ausführen.

Erstellen der Tabelle

Um aus diesen Daten eine Tabelle zu erzeugen, erstellen Sie wie in der folgenden Athena-DDL-Anweisung eine Partition für „dt“:

CREATE EXTERNAL TABLE impressions ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string, number string, processId string, browserCookie string, requestEndTime string, timers struct<modelLookup:string, requestTime:string>, threadId string, hostname string, sessionId string) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;

Diese Tabelle nutzt den Hive-eigenen JSON-SerDe (Serializer/Deserializer) zum Lesen der in Amazon S3 gespeicherten JSON-Daten. Weitere Informationen zu den unterstützten Formaten finden Sie unter Unterstützte SerDes- und Daten-Formate.

MSCK REPAIR TABLE ausführen

Führen Sie nach dem Ausführen der CREATE TABLE-Abfrage den MSCK REPAIR TABLE-Befehl im Athena-Abfrageeditor aus, um die Partitionen zu laden, wie im folgenden Beispiel.

MSCK REPAIR TABLE impressions

Nachdem Sie diesen Befehl ausführen, sind die Daten für die Abfrage bereit.

Abfragen der Daten

Führen Sie mithilfe der partitionierten Spalte eine Datenabfrage für die Tabelle „impressions“ aus. Ein Beispiel:

SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100

Diese Abfrage sollte Ergebnisse ähnlich den folgenden anzeigen:

2009-04-12-13-20 ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc 2009-04-12-13-20 17uchtodoS9kdeQP1x0XThKl5IuRsV 2009-04-12-13-20 JOUf1SCtRwviGw8sVcghqE5h0nkgtp 2009-04-12-13-20 NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH 2009-04-12-13-20 fFAItiBMsgqro9kRdIwbeX60SROaxr 2009-04-12-13-20 V4og4R9W6G3QjHHwF7gI1cSqig5D1G 2009-04-12-13-20 hPEPtBwk45msmwWTxPVVo1kVu4v11b 2009-04-12-13-20 v0SkfxegheD90gp31UCr6FplnKpx6i 2009-04-12-13-20 1iD9odVgOIi4QWkwHMcOhmwTkWDKfj 2009-04-12-13-20 b31tJiIA25CK8eDHQrHnbcknfSndUk

Szenario 2: Daten werden nicht im Hive-Format partitioniert

Im folgenden Beispiel zeigt der aws s3 ls-Befehl ELB-Protokolle an, die in Amazon S3 gespeichert sind. Beachten Sie, dass das Datenlayout keine key=value-Paare verwendet und daher nicht im Hive-Format vorliegt. (Die --recursive-Option für den aws s3 ls-Befehl gibt an, dass alle Dateien oder Objekte unter dem angegebenen Verzeichnis oder Präfix aufgelistet werden.)

aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive 2016-11-23 17:54:46 11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 0 elb/plaintext/2015/01/01_$folder$ 2016-11-23 17:54:47 9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 0 elb/plaintext/2015/01/02_$folder$ 2016-11-23 17:54:48 11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 0 elb/plaintext/2015/01/03_$folder$ 2016-11-23 17:54:50 8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/04_$folder$ 2016-11-23 17:54:51 7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/05_$folder$ 2016-11-23 17:54:51 11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 0 elb/plaintext/2015/01/06_$folder$ 2016-11-23 17:54:52 8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 0 elb/plaintext/2015/01/07_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015/01_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015_$folder$

ALTER TABLE ADD PARTITION ausführen

Da die Daten nicht im Hive-Format vorliegen, können Sie den MSCK REPAIR TABLE-Befehl nicht verwenden, um der Tabelle die Partitionen hinzuzufügen, nachdem Sie sie erstellt haben. Stattdessen können Sie den ALTER TABLE ADD PARTITION-Befehl verwenden, um jede Partition manuell hinzuzufügen. Um beispielsweise die Daten in s3://athena-examples-myregion/elb/plaintext/2015/01/01/ zu laden, können Sie die folgende Abfrage ausführen. Beachten Sie, dass nicht für jeden Amazon-S3-Ordner eine separate Partitionsspalte erforderlich ist und dass sich der Partitionsschlüsselwert vom Amazon-S3-Schlüssel unterscheiden kann.

ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-us-west-1/elb/plaintext/2015/01/01/'

Wenn bereits eine Partition vorhanden ist, erhalten Sie die Fehlermeldung Partition bereits vorhanden. Um diesen Fehler zu vermeiden, können Sie die IF NOT EXISTS-Klausel verwenden. Weitere Informationen finden Sie unter ALTER TABLE ADD PARTITION. Um eine Partition zu entfernen, können Sie ALTER TABLE DROP PARTITION verwenden.

Partitionsprojektion

Um zu vermeiden, dass Partitionen verwaltet werden müssen, können Sie die Partitionsprojektion verwenden. Die Partitionsprojektion ist eine Option für hoch partitionierte Tabellen, deren Struktur im Voraus bekannt ist. Bei der Partitionsprojektion werden Partitionswerte und Speicherorte aus Tabelleneigenschaften berechnet, die Sie konfigurieren, anstatt aus einem Metadaten-Repository zu lesen. Da die Berechnungen im Arbeitsspeicher schneller sind als die Remote-Suche, kann die Verwendung der Partitionsprojektion die Abfragelaufzeiten erheblich verkürzen.

Weitere Informationen finden Sie unter Partitionsprojektion mit Amazon Athena.

Weitere Ressourcen