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/
). In Athena führen Speicherorte, die andere Protokolle verwenden (z. B.folder
/s3a://DOC-EXAMPLE-BUCKET/
), zu Abfragefehlern, wennfolder
/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
stattuserId
). Wenn der S3-Pfad in Camel-Case geschrieben ist, fügtMSCK 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 zum Beispiel an, Sie haben Daten für Tabelle 1 ins3://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 Sies3://DOC-EXAMPLE-BUCKET2
stattdessen separate Ordnerstrukturen wies3://DOC-EXAMPLE-BUCKET1
und. Beachten Sie, dass dieses Verhalten mit Amazon EMR und Apache Hive übereinstimmt. -
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.
-
Athena unterstützt zwar das Abfragen von AWS Glue Tabellen mit 10 Millionen Partitionen, Athena kann jedoch nicht mehr als 1 Million Partitionen in einem einzigen Scan lesen. In solchen Szenarien kann die Indizierung von Partitionen von Vorteil sein. Weitere Informationen finden Sie im AWS Big-Data-Blogartikel Verbessern Sie die Abfrageleistung von Amazon Athena mithilfe von AWS Glue Data Catalog Partitionsindizes
.
-
-
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
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 Daten in diesen Unterordnern abfragen.
Erstellen der Tabelle
Um aus diesen Daten eine Tabelle zu erstellen, erstellen Sie eine Partition entlang von 'dt' wie in der folgenden DDL Athena-Anweisung:
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 verwendet den systemeigenen JSON Serializer-Deserializer von Hive, um in Amazon S3 gespeicherte Daten zu lesen. JSON Weitere Informationen zu den unterstützten Formaten finden Sie unter SerDes Unterstützte Datenformate.
Ausführen MSCK REPAIR TABLE
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 in Amazon S3 gespeicherte ELBProtokolle an. 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/ --recursive2016-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$
Ausführen ALTER TABLE ADD PARTITION
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 zu laden -myregion
/elb/plaintext/2015/01/01/ 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
-
Hinweise zu Partitionierungsoptionen für Firehose-Daten finden Sie unter. Beispiel für Amazon Data Firehose
-
Sie können das Hinzufügen von Partitionen mithilfe des JDBC Treibers automatisieren.
-
Sie können CTAS und verwenden INSERTINTO, um einen Datensatz zu partitionieren. Weitere Informationen finden Sie unter Verwenden von CTAS und INSERT INTO für ETL und Datenanalyse.