Was ist Partitionierung? - 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.

Was ist Partitionierung?

Partitionierung bedeutet, Daten auf Amazon S3 auf der Grundlage einer bestimmten Eigenschaft der Daten in Verzeichnissen (oder „Präfixen“) zu organisieren. Solche Eigenschaften werden Partitionsschlüssel genannt. Ein üblicher Partitionsschlüssel ist das Datum oder eine andere Zeiteinheit wie das Jahr oder der Monat. Ein Datensatz kann jedoch nach mehr als einem Schlüssel partitioniert werden. Beispielsweise können Daten über Produktverkäufe nach Datum, Produktkategorie und Markt partitioniert werden.

Entscheiden, wie partitioniert werden soll

Gute Kandidaten für Partitionsschlüssel sind Eigenschaften, die in Abfragen immer oder häufig verwendet werden und eine geringe Kardinalität aufweisen. Es gibt einen Kompromiss zwischen zu vielen Partitionen und zu wenigen. Bei zu vielen Partitionen führt die erhöhte Anzahl von Dateien zu Mehraufwand. Außerdem entsteht durch das Filtern der Partitionen selbst ein gewisser Mehraufwand. Bei zu wenigen Partitionen müssen Abfragen oft mehr Daten scannen.

Erstellen Sie eine partitionierte Tabelle

Wenn ein Datensatz partitioniert ist, können Sie in Athena eine partitionierte Tabelle erstellen. Eine partitionierte Tabelle ist eine Tabelle mit Partitionsschlüsseln. Wenn Sie CREATE TABLE verwenden, fügen Sie der Tabelle Partitionen hinzu. Wenn Sie CREATE TABLE AS verwenden, werden die Partitionen, die auf Amazon S3 erstellt wurden, automatisch zur Tabelle hinzugefügt.

In einer CREATE TABLE-Anweisung geben Sie die Partitionsschlüssel in der PARTITIONED BY (column_name data_type)-Klausel an. In einer CREATE TABLE AS Anweisung geben Sie die Partitionsschlüssel in einer WITH (partitioned_by = ARRAY['partition_key'])-Klausel oder WITH (partitioning = ARRAY['partition_key']) für Iceberg-Tabellen an. Aus Leistungsgründen sollten Partitionsschlüssel immer vom Typ STRING sein. Weitere Informationen finden Sie unter String als Datentyp für Partitionsschlüssel verwenden.

Weitere Informationen CREATE TABLE und Informationen zur CREATE TABLE AS-Syntax finden Sie unter CREATE TABLE und CTASEigenschaften von Tabellen.

Fragen Sie partitionierte Tabellen ab

Wenn Sie eine partitionierte Tabelle abfragen, verwendet Athena die Prädikate in der Abfrage, um die Liste der Partitionen zu filtern. Anschließend verwendet es die Speicherorte der passenden Partitionen, um die gefundenen Dateien zu verarbeiten. Athena kann die Menge der gescannten Daten effizient reduzieren, indem es einfach keine Daten in den Partitionen liest, die nicht den Abfrageprädikaten entsprechen.

Beispiele

Angenommen, Sie haben eine Tabelle, die nach sales_date und product_category partitioniert ist und möchten den Gesamtumsatz einer Woche in einer bestimmten Kategorie ermitteln. Sie fügen Prädikate in die sales_date- und product_category-Spalten ein, um sicherzustellen, dass Athena nur die minimale Datenmenge scannt, wie im folgenden Beispiel.

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND product_category = 'Toys'

Angenommen, Sie haben einen Datensatz, der nach Datum partitioniert ist, aber auch über einen detaillierten Zeitstempel verfügt.

Bei Iceberg-Tabellen können Sie einen Partitionsschlüssel so deklarieren, dass er eine Beziehung zu einer Spalte hat, aber bei Hive-Tabellen hat die Abfrage-Engine keine Kenntnis von den Beziehungen zwischen Spalten und Partitionsschlüsseln. Aus diesem Grund müssen Sie sowohl für die Spalte als auch für den Partitionsschlüssel in Ihrer Abfrage ein Prädikat angeben, um sicherzustellen, dass die Abfrage nicht mehr Daten scannt als nötig.

Nehmen wir beispielsweise an, dass die sales-Tabelle im vorherigen Beispiel auch eine sold_at-Spalte des TIMESTAMP-Datentyps enthält. Wenn Sie den Umsatz nur für einen bestimmten Zeitraum ermitteln möchten, würden Sie die Abfrage wie folgt schreiben:

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date = '2023-02-28' AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' AND product_category = 'Toys'

Weitere Informationen zu diesem Unterschied zwischen der Abfrage von Hive- und Iceberg-Tabellen finden Sie unter Wie Sie Abfragen für Zeitstempelfelder schreiben, die ebenfalls zeitpartitioniert sind.