Verwenden Sie dynamische ID-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.

Verwenden Sie dynamische ID-Partitionierung

Wenn Ihre Daten nach einer Eigenschaft mit hoher Kardinalität partitioniert sind oder die Werte nicht im Voraus bekannt sind, können Sie den injected-Projektionstyp verwenden. Beispiele für solche Eigenschaften sind Benutzernamen sowie IDs Geräte oder Produkte. Wenn Sie den injected-Projektionstyp zum Konfigurieren eines Partitionsschlüssels verwenden, verwendet Athena Werte aus der Abfrage selbst, um die Menge der zu lesenden Partitionen zu berechnen.

Damit Athena eine Abfrage für eine Tabelle ausführen kann, deren Partitionsschlüssel mit dem injected-Projektionstyp konfiguriert ist, muss Folgendes zutreffen:

  • Ihre Abfrage muss mindestens einen Wert für den Partitionsschlüssel enthalten.

  • Bei den Werten muss es sich um Literale oder Ausdrücke handeln, die ohne Lesen von Daten ausgewertet werden können.

Wenn eines dieser Kriterien nicht erfüllt ist, schlägt Ihre Abfrage mit der folgenden Fehlermeldung fehl:

CONSTRAINT_VIOLATION: Für die Spalte mit der injizierten projizierten Partition column_name, die WHERE Klausel darf nur statische Gleichheitsbedingungen enthalten, und mindestens eine solche Bedingung muss erfüllt sein.

Wann sollte der injected Projektionstyp verwendet werden

Stellen Sie sich vor, Sie haben einen Datensatz, der aus Ereignissen von IoT-Geräten besteht, die auf den Geräten IDs partitioniert sind. Dieser Datensatz weist folgende Merkmale auf:

  • Die Geräte IDs werden zufällig generiert.

  • Neue Geräte werden regelmäßig bereitgestellt.

  • Derzeit gibt es Hunderttausende Geräte und in Zukunft werden es Millionen sein.

Dieser Datensatz lässt sich mit herkömmlichen Metastores nur schwer verwalten. Es ist schwierig, die Partitionen zwischen dem Datenspeicher und dem Metastore synchron zu halten. Das Filtern von Partitionen kann während der Abfrageplanung langsam sein. Wenn Sie jedoch eine Tabelle für die Verwendung der Partitionsprojektion konfigurieren und den injected-Projektionstyp verwenden, haben Sie zwei Vorteile: Sie müssen keine Partitionen im Metastore verwalten und Ihre Abfragen müssen nicht nach Partitionsmetadaten suchen.

Im folgenden CREATE TABLE-Beispiel wird eine Tabelle für den soeben beschriebenen Geräteereignisdatensatz erstellt. Die Tabelle verwendet den Typ der injizierten Projektion.

CREATE EXTERNAL TABLE device_events ( event_time TIMESTAMP, data STRING, battery_level INT ) PARTITIONED BY ( device_id STRING ) LOCATION "s3://amzn-s3-demo-bucket/prefix/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.device_id.type" = "injected", "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${device_id}" )

Die folgende Beispielabfrage ermittelt die Anzahl der Ereignisse, die innerhalb von 12 Stunden von drei bestimmten Geräten empfangen wurden.

SELECT device_id, COUNT(*) AS events FROM device_events WHERE device_id IN ( '4a770164-0392-4a41-8565-40ed8cec737e', 'f71d12cf-f01f-4877-875d-128c23cbde17', '763421d8-b005-47c3-ba32-cc747ab32f9a' ) AND event_time BETWEEN TIMESTAMP '2023-11-01 20:00' AND TIMESTAMP '2023-11-02 08:00' GROUP BY device_id

Wenn Sie diese Abfrage ausführen, identifiziert Athena die drei Werte für den device_id-Partitionsschlüssel und verwendet sie zur Berechnung der Partitionsspeicherorte. Athena verwendet den Wert für die storage.location.template-Eigenschaft, um die folgenden Standorte zu generieren:

  • s3://amzn-s3-demo-bucket/prefix/4a770164-0392-4a41-8565-40ed8cec737e

  • s3://amzn-s3-demo-bucket/prefix/f71d12cf-f01f-4877-875d-128c23cbde17

  • s3://amzn-s3-demo-bucket/prefix/763421d8-b005-47c3-ba32-cc747ab32f9a

Wenn Sie die storage.location.template-Eigenschaft in der Konfiguration der Partitionsprojektion weglassen, verwendet Athena eine Partitionierung im Hive-Stil, um Partitionspositionen basierend auf dem Wert in LOCATION zu projizieren (z. B. s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e).