Usa il partizionamento dinamico degli ID - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Usa il partizionamento dinamico degli ID

Quando i dati sono partizionati in base a una proprietà con cardinalità elevata o quando i valori non possono essere conosciuti in anticipo, è possibile utilizzare il tipo di proiezione injected. Esempi di tali proprietà sono i nomi utente e i dispositivi o IDs i prodotti. Quando si utilizza il tipo di proiezione injected per configurare una chiave di partizione, Athena utilizza i valori della query stessa per calcolare l'insieme di partizioni che verranno lette.

Affinché Athena sia in grado di eseguire una query su una tabella con una chiave di partizione configurata con il tipo di proiezione injected, deve essere vero quanto segue:

  • La query deve includere almeno un valore per la chiave di partizione.

  • I valori devono essere letterali o espressioni che possono essere valutate senza leggere alcun dato.

Se uno di questi criteri non viene soddisfatto, la query ha esito negativo e viene visualizzato il seguente errore:

CONSTRAINT_VIOLATION: Per la colonna di partizione proiettata iniettata column_name, la WHERE clausola deve contenere solo condizioni di uguaglianza statiche e deve essere presente almeno una di queste condizioni.

Quando usare il tipo di injected proiezione

Immagina di avere un set di dati composto da eventi provenienti da dispositivi IoT, partizionati sui dispositivi». IDs Questo esempio presenta le caratteristiche seguenti:

  • I dispositivi vengono generati in modo casuale. IDs

  • Nuovi dispositivi vengono forniti frequentemente.

  • Attualmente i dispositivi ammontano a centinaia di migliaia e in futuro saranno milioni.

Questo set di dati è difficile da gestire utilizzando i metastore tradizionali. È difficile mantenere sincronizzate le partizioni tra l'archiviazione di dati e il metastore e il filtraggio delle partizioni può essere lento durante la pianificazione delle query. Tuttavia, se si configura una tabella per utilizzare la proiezione delle partizioni e si utilizza il tipo di proiezione injected, si ottengono due vantaggi: non è necessario gestire le partizioni nel metastore e le query non devono cercare i metadati delle partizioni.

L'esempio di CREATE TABLE seguente crea una tabella per il set di dati degli eventi del dispositivo appena descritto. La tabella utilizza il tipo di proiezione iniettata.

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}" )

La seguente query di esempio cerca il numero di eventi ricevuti da tre dispositivi specifici nell'arco di 12 ore.

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

Quando si esegue questa query, Athena vede i tre valori per la chiave di partizione device_id e li usa per calcolare le posizioni delle partizioni. Athena utilizza il valore della proprietà storage.location.template per generare le seguenti posizioni:

  • 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

Se si omette la proprietà storage.location.template dalla configurazione di proiezione della partizione, Athena utilizza il partizionamento in stile Hive per proiettare le posizioni delle partizioni in base al valore in LOCATION (ad esempio, s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e).