Was ist Bucketing? - 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 Bucketing?

Bucketing ist eine Möglichkeit, die Inhalte eines Datensatzes in Kategorien zu organisieren, die als Buckets bezeichnet werden.

Die Bedeutung von Bucket und Bucketing unterscheidet sich von Amazon-S3-Buckets und sollte nicht mit diesen verwechselt werden. Beim Daten-Bucketing werden Datensätze, die denselben Wert für eine Eigenschaft haben, in denselben Bucket verschoben. Datensätze werden so gleichmäßig wie möglich auf die Buckets verteilt, sodass jeder Bucket ungefähr die gleiche Datenmenge enthält.

In der Praxis handelt es sich bei den Buckets um Dateien, und eine Hash-Funktion bestimmt, in welchen Bucket ein Datensatz aufgenommen wird. Ein bucketierter Datensatz enthält eine oder mehrere Dateien pro Bucket und Partition. Der Bucket, zu dem eine Datei gehört, ist im Dateinamen kodiert.

Vorteile von Bucketing

Bucketing ist nützlich, wenn eine Datenmenge einer bestimmten Eigenschaft bucketiert ist und Sie Datensätze abrufen möchten, in denen diese Eigenschaft einen bestimmten Wert hat. Da die Daten bucketiert sind, kann Athena anhand des Werts bestimmen, welche Dateien betrachtet werden sollen. Nehmen wir zum Beispiel an, dass ein Datensatz nach customer_id bucketiert ist und Sie alle Datensätze für einen bestimmten Kunden suchen möchten. Athena bestimmt den Bucket, der diese Datensätze enthält, und liest nur die Dateien in diesem Bucket.

Gute Kandidaten für das Bucketing sind Spalten mit hoher Kardinalität (d. h. mit vielen unterschiedlichen Werten), die gleichmäßig verteilt sind und die Sie häufig nach bestimmten Werten abfragen.

Anmerkung

Athena unterstützt nicht die Verwendung von INSERT INTO zum Hinzufügen neuer Datensätze zu bucketierten Tabellen.

Unterstützte Datentypen für das Filtern von Spalten mit Zeiträumen

Sie können Filter für bucketierte Spalten mit bestimmten Datentypen hinzufügen. Athena unterstützt eine solche Filterung nur für bucketierte Spalten mit den folgenden Datentypen:

  • BOOLEAN

  • BYTE

  • DATE

  • DOUBLE

  • FLOAT

  • INT

  • LONG

  • SHORT

  • STRING

  • VARCHAR

Unterstützung für Hive und Spark

Athena-Engine-Version 2 unterstützt Datensätze, die mit dem Hive-Bucket-Algorithmus in Buckets zusammengefasst wurden, und Athena-Engine-Version 3 unterstützt auch den Apache-Spark-Bucketing-Algorithmus. Hive-Bucketing ist die Standardeinstellung. Wenn Ihr Datensatz mithilfe des Spark-Algorithmus in einem Bucket zusammengefasst wird, verwenden Sie die TBLPROPERTIES-Klausel, um den bucketing_format-Eigenschaftswert auf spark festzulegen.

Anmerkung

Athena hat ein Limit von 100 Partitionen in einer CREATE TABLE AS SELECT (CTAS) -Abfrage. Ebenso können Sie einer Zieltabelle mit einer INSERT INTO-Anweisung maximal 100 Partitionen hinzufügen.

Wenn Sie diese Beschränkung überschreiten, erhalten Sie möglicherweise die Fehlermeldung HIVE_ _ _ TOO MANY OPEN _PARTITIONS: Das Limit von 100 offenen Writern für Partitionen/Buckets wurde überschritten. Um diese Einschränkung zu umgehen, können Sie eine CTAS Anweisung und eine Reihe von INSERT INTO Anweisungen verwenden, die jeweils bis zu 100 Partitionen erstellen oder einfügen. Weitere Informationen finden Sie unter Verwenden Sie CTAS und INSERTINTO, um das Limit von 100 Partitionen zu umgehen.

Verwenden Sie die CLUSTERED BY (column)-Klausel, gefolgt von der INTO N BUCKETS-Klausel, um eine Tabelle für einen vorhandenen Bucket-Datensatz zu erstellen. Die INTO N BUCKETS-Klausel gibt die Anzahl der Buckets an, in die die Daten aufgeteilt werden.

Im folgenden CREATE TABLE-Beispiel wird der sales-Datensatz mithilfe des Spark-Algorithmus customer_id in 8 Buckets aufgeteilt. Die CREATE TABLE-Anweisung verwendet die Klauseln CLUSTERED BY und TBLPROPERTIES, um die Eigenschaften entsprechend festzulegen.

CREATE EXTERNAL TABLE sales (...) ... CLUSTERED BY (`customer_id`) INTO 8 BUCKETS ... TBLPROPERTIES ( 'bucketing_format' = 'spark' )

Um Bucketing mit CREATE TABLE AS zu spezifizieren, verwenden Sie die Parameter bucket_count und bucketed_by, wie im folgenden Beispiel gezeigt.

CREATE TABLE sales WITH ( ... bucketed_by = ARRAY['customer_id'], bucket_count = 8 ) AS SELECT ...

In der folgenden Beispielabfrage wird nach den Namen von Produkten gesucht, die ein bestimmter Kunde im Laufe einer Woche gekauft hat.

SELECT DISTINCT product_name FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND customer_id = 'c123'

Wenn diese Tabelle von sales_date partitioniert ist und von customer_id bucketiert ist, kann Athena den Bucket berechnen, in dem sich die Kundendatensätze befinden. Athena liest höchstens eine Datei pro Partition.